[英]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;}
}
@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.