我正在尝试制作一个简单的聊天应用程序以开始使用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列表。
答案 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
中,甚至在您想要重命名等情况下,也可以更快,更安全。