如何在 .NET Core API 中将列表显示到包含其他信息的视图中?
How to show a list into a view with other info in .NET Core API?
我正在创建一个应用程序,注册用户可以在其中发布和查看帖子,类似于论坛。在“详细信息”视图中,用户应该可以查看他的信息和他所做的出版物列表,为此,我创建了一个包含两个 class 的模型 class,一个用于用户数据,另一个用于列出出版物。为了检索所有必要的数据,API 接收一个 int,它是从 MVC 控制器及其各自的视图发送的用户 ID,因此基本上 API 由视图及其 MVC 控制器使用.
我遇到的问题是 API 对 MVC 控制器的响应是 500 错误,因此(我认为),在 foreach
视图 System.NullReferenceException: 'Object reference not set to an instance of an object.'
发生异常。我一直在通过在 API 中放置一些断点来寻找错误,但没有异常或类似的东西。
模特:
public class UserForumModel
{
public User user { get; set; } //user data like name, email, id, etc...
public IList<Forum> userForum { get; set; } //the list with the posts made by the user
}
API 控制器:
[HttpGet]
[Route("viewUser/{id}")]
public IActionResult viewUser(int id)
{
UserForumModel userInfo = new UserForumModel();
var user = db.User.Where(x => x.Id == id).FirstOrDefault();
var userForum = db.Forum.Where(x => x.IdUser == user.Id).ToList();
userInfo.user = user;
userInfo.userForum = userForum;
return Ok(userInfo);
}
MVC 控制器:
[HttpGet]
public async Task<IActionResult> viewUser(int id)
{
UserForumModel userInfo = new UserForumModel();
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://localhost:44325/api/Admin/");
var responseTask = client.GetAsync("viewUser/" + id);
responseTask.Wait();
var result = responseTask.Result; //here is where the 500 error can be seen
//with a breakpoint
if (result.IsSuccessStatusCode)
{
var apiResp = await result.Content.ReadAsStringAsync();
userInfo = JsonConvert.DeserializeObject<UserForumModel>(apiResp);
return View(userInfo);
}
else
{
ModelState.AddModelError(string.Empty, "Server error");
return View();
}
}
}
观点:
@model APIproyect.Models.UserList.UserForumModel
<div class="main">
<div>
<hr />
<dl class="row">
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.user.Name)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.user.Name)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.user.Email)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.user.Email)
</dd>
</dl>
<table class="table">
<thead>
<tr>
<th>
Tittle
</th>
<th>
Post date
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.userForo) <!--the exception happens-->
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Tittle)
</td>
<td>
@Html.DisplayFor(modelItem => item.Postdate)
</td>
</tr>
}
</tbody>
</table>
</div>
我已经坚持了一段时间,非常感谢任何帮助。
更新
我换了型号;我删除了列表部分并使用每个字段的变量存储用户数据。
public class UserForumModel
{
public string Name { get; set; } //user data like name, email, id, etc...
public string Email {get; set;}
//public IList<Forum> userForum { get; set; } //the list with the posts made by the user
}
使用上面的代码,API 响应 returns 200 (Ok)。但是我还是想不出真正的解决办法。
感谢任何帮助。
修正代码
//remove
//UserForumModel userInfo = new UserForumModel();
var baseAddress="https://localhost:44325";
client.BaseAddress = new Uri(baseAddress);
var result = await client.GetAsync(baseAddress+"/api/Admin/viewUser/" + id);
if (result.IsSuccessStatusCode)
{
var apiResp = await result.Content.ReadAsStringAsync();
var userInfo = JsonConvert.DeserializeObject<UserForumModel>(apiResp);
return View(userInfo);
}
.....
并查看
@if ( Model.userForo != null )
{
@foreach (var item in Model.userForo)
{
......
}
}
也许重构 API 也是个好主意
public ActionResult<UserForumModel> viewUser(int id)
感谢之前的回答和评论,我成功解决了我的问题。这是我在收到的帮助下所做的:
在 API 控制器上:
[HttpGet]
[Route("viewUser/{id}")]
public ActionResult<UserForumModel> viewUser(int id)
{
var user = db.Users.Where(x => x.Id == id).FirstOrDefault();
var model = new UserForumModel
{
user = new User
{
Id = user.Id,
Name = user.Name,
Email = user.Email
},
userForum = db.Forum.Select(s => new Forum()
{
IdUser = s.IdUser,
Tittle = s.Tittle,
PostDate = s.PostDate
}
).Where(x=>x.Id == user.Id).ToList<Forum>(),
};
return Ok(model);
}
型号:
public class UserForumModel
{
public Users user { get; set; }
public IList<Forum> userForum { get; set; }
}
通过上面的代码,我使视图显示了信息和列表。
我正在创建一个应用程序,注册用户可以在其中发布和查看帖子,类似于论坛。在“详细信息”视图中,用户应该可以查看他的信息和他所做的出版物列表,为此,我创建了一个包含两个 class 的模型 class,一个用于用户数据,另一个用于列出出版物。为了检索所有必要的数据,API 接收一个 int,它是从 MVC 控制器及其各自的视图发送的用户 ID,因此基本上 API 由视图及其 MVC 控制器使用.
我遇到的问题是 API 对 MVC 控制器的响应是 500 错误,因此(我认为),在 foreach
视图 System.NullReferenceException: 'Object reference not set to an instance of an object.'
发生异常。我一直在通过在 API 中放置一些断点来寻找错误,但没有异常或类似的东西。
模特:
public class UserForumModel
{
public User user { get; set; } //user data like name, email, id, etc...
public IList<Forum> userForum { get; set; } //the list with the posts made by the user
}
API 控制器:
[HttpGet]
[Route("viewUser/{id}")]
public IActionResult viewUser(int id)
{
UserForumModel userInfo = new UserForumModel();
var user = db.User.Where(x => x.Id == id).FirstOrDefault();
var userForum = db.Forum.Where(x => x.IdUser == user.Id).ToList();
userInfo.user = user;
userInfo.userForum = userForum;
return Ok(userInfo);
}
MVC 控制器:
[HttpGet]
public async Task<IActionResult> viewUser(int id)
{
UserForumModel userInfo = new UserForumModel();
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://localhost:44325/api/Admin/");
var responseTask = client.GetAsync("viewUser/" + id);
responseTask.Wait();
var result = responseTask.Result; //here is where the 500 error can be seen
//with a breakpoint
if (result.IsSuccessStatusCode)
{
var apiResp = await result.Content.ReadAsStringAsync();
userInfo = JsonConvert.DeserializeObject<UserForumModel>(apiResp);
return View(userInfo);
}
else
{
ModelState.AddModelError(string.Empty, "Server error");
return View();
}
}
}
观点:
@model APIproyect.Models.UserList.UserForumModel
<div class="main">
<div>
<hr />
<dl class="row">
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.user.Name)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.user.Name)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.user.Email)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.user.Email)
</dd>
</dl>
<table class="table">
<thead>
<tr>
<th>
Tittle
</th>
<th>
Post date
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.userForo) <!--the exception happens-->
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Tittle)
</td>
<td>
@Html.DisplayFor(modelItem => item.Postdate)
</td>
</tr>
}
</tbody>
</table>
</div>
我已经坚持了一段时间,非常感谢任何帮助。
更新
我换了型号;我删除了列表部分并使用每个字段的变量存储用户数据。
public class UserForumModel
{
public string Name { get; set; } //user data like name, email, id, etc...
public string Email {get; set;}
//public IList<Forum> userForum { get; set; } //the list with the posts made by the user
}
使用上面的代码,API 响应 returns 200 (Ok)。但是我还是想不出真正的解决办法。
感谢任何帮助。
修正代码
//remove
//UserForumModel userInfo = new UserForumModel();
var baseAddress="https://localhost:44325";
client.BaseAddress = new Uri(baseAddress);
var result = await client.GetAsync(baseAddress+"/api/Admin/viewUser/" + id);
if (result.IsSuccessStatusCode)
{
var apiResp = await result.Content.ReadAsStringAsync();
var userInfo = JsonConvert.DeserializeObject<UserForumModel>(apiResp);
return View(userInfo);
}
.....
并查看
@if ( Model.userForo != null )
{
@foreach (var item in Model.userForo)
{
......
}
}
也许重构 API 也是个好主意
public ActionResult<UserForumModel> viewUser(int id)
感谢之前的回答和评论,我成功解决了我的问题。这是我在收到的帮助下所做的:
在 API 控制器上:
[HttpGet]
[Route("viewUser/{id}")]
public ActionResult<UserForumModel> viewUser(int id)
{
var user = db.Users.Where(x => x.Id == id).FirstOrDefault();
var model = new UserForumModel
{
user = new User
{
Id = user.Id,
Name = user.Name,
Email = user.Email
},
userForum = db.Forum.Select(s => new Forum()
{
IdUser = s.IdUser,
Tittle = s.Tittle,
PostDate = s.PostDate
}
).Where(x=>x.Id == user.Id).ToList<Forum>(),
};
return Ok(model);
}
型号:
public class UserForumModel
{
public Users user { get; set; }
public IList<Forum> userForum { get; set; }
}
通过上面的代码,我使视图显示了信息和列表。