繁体   English   中英

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

[英]C# ASP.NET Core - wrong data type being passed to Partial View?

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

错误: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列表。

与其传递对象列表,不如创建一个类:

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 ,甚至在您想要重命名等情况下,也可以更快,更安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM