C#ASP.NET Core-将错误的数据类型传递给部分视图?

时间:2019-03-22 11:47:50

标签: c# asp.net asp.net-core asp.net-core-mvc core

我正在尝试制作一个简单的聊天应用程序以开始使用ASP.NET,我的局部视图似乎正在接收传递给Index.cshtml的数据类型,而不是我打算传递给PersistantMessagesPartial.cshtml的数据。< / p>

错误: InvalidOperationException:传递到ViewDataDictionary中的模型项的类型为'System.Collections.Generic.List 1[WebChat.Areas.Identity.Data.AppUser]', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.List 1 [WebChat.Models.MessageModel]'。

在HomeController.cs中:

 public async Task<IActionResult> Index()
    {
        Debug.WriteLine("debug1");
        return View(await _AppUserDBContext.userList.ToListAsync());
    }

    public async Task<IActionResult> _PersistantMessagesPartial()
    {
        Debug.WriteLine("debug2");
        return PartialView("_PersistantMessagesPartial", await _MessageModelDBContext.messageList.ToListAsync());
    }

在_PersistantMessagesPartial.cshtml中:

@model List<WebChat.Models.MessageModel>
<script>
    console.log("test");
</script>
@foreach(var item in Model)
{
    <script>
        console.log("MessagePartial");
        console.log(@item.Contents);
    </script>
}

我如何在_Layout.cshtml中渲染部分图片:

<partial name="_PersistantMessagesPartial" />

Index.cshtml接收到一个AppUser列表,并且可以正常工作。我不确定如何使_PersistantMessagesPartial接收MessageModel列表而不是AppUser列表。

1 个答案:

答案 0 :(得分:3)

我无需传递对象列表,而是创建一个类:

public class PersistantMessagesPartialModel{
    public List<WebChat.Models.MessageModel> Messages{get;set;}
}

并使用for属性传递对象,如下所示:

@model IndexViewModel

<partial name="_PersistantMessagesPartial.cshtml" for="PersistantMessagesPartialModel" />

然后您的局部视图如下:

@model PersistantMessagesPartialModel

@foreach(var item in Model.Messages)
{
    <script>
        console.log("MessagePartial");
        console.log(@item.Contents);
    </script>
}

控制器看起来像这样:

  [HttpGet]
  public async Task<IActionResult> Index()
  {
       var viewModel = new IndexViewModel(){
          PersistantMessagesPartialModel = new 
          PersistantMessagesPartialModel(){
                Messages = await 
           _AppUserDBContext.userList.ToListAsync()
            };
      return View(viewModel);
   }

IndexViewModel如下所示:

public class IndexViewModel{
    public PersistantMessagesPartialModel  
    PersistantMessagesPartialModel {get;set;}
}

我知道ASP.NET MVC允许您将给定页面的模型定义为对象列表,但是我相信每个.cshtml页面应具有单个模型类的规则。当您想向视图中添加一些新逻辑时,它为您提供了极大的灵活性。试想一下一个简单的情况,您想在部分视图中添加一些if语句,该语句将根据应用程序后端中设置的某些值来工作。在这种情况下,您将需要使用ViewBag,ViewData对象将其传递给视图,并且这很难维护,尤其是在您的应用很大的情况下。 在我的解决方案中,您只需将此额外字段添加到PersistantMessagesPartialModel中,甚至在您想要重命名等情况下,也可以更快,更安全。