如何在 .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; }
}

通过上面的代码,我使视图显示了信息和列表。