MVC4中如何在父视图中调用多个分部视图?
解决分部视图模型类型不匹配的问题
兄弟,你碰到的这个System.InvalidOperationException错误其实非常明确——你给分部视图传递的模型类型和它期望的完全不搭:你传的是Aplication.Models.ABC.ClsA对象,但分部视图需要的是IEnumerable<Aplication.Models.ABC.XXX>(错误提示里的fi...就是这个泛型对应的具体模型类名)。
我给你一步步说怎么排查和解决:
1. 先确认分部视图的模型要求
打开你的分部视图,看最顶部的模型声明,应该是类似这样的:
@model IEnumerable<Aplication.Models.ABC.YourFiModel>
这里的YourFiModel就是错误里提到的fi...对应的完整类名,先记下来这个类型。
2. 检查父视图调用分部视图的姿势
父视图的模型是ClsA,你肯定是直接把整个父模型传给了分部视图,才导致类型不匹配。正确的做法是:
从ClsA里找到对应类型的集合属性(也就是IEnumerable<YourFiModel>类型的属性),把这个属性传给分部视图。
举个例子:
假设你的ClsA里有个叫FiDataList的属性,类型正好是IEnumerable<YourFiModel>,那调用分部视图就要这么写:
// 同步写法 @Html.Partial("你的分部视图名称", Model.FiDataList) // 异步写法 @await Html.PartialAsync("你的分部视图名称", Model.FiDataList)
如果ClsA里没有现成的集合属性,那你得在父视图里先构造出符合要求的集合,再传进去:
@{ // 先创建一个空集合或者从ClsA的数据里组装出集合 var fiCollection = new List<Aplication.Models.ABC.YourFiModel>(); // 这里可以根据ClsA的属性填充fiCollection的数据 } @Html.Partial("你的分部视图名称", fiCollection)
3. 额外注意点
- 千万别传null!如果你的集合可能为空,建议在父视图里传递
Enumerable.Empty<YourFiModel>(),或者在分部视图开头加个null判断:@model IEnumerable<Aplication.Models.ABC.YourFiModel> @if (Model == null) { <p>暂无数据</p> return; } - 如果你用的是
RenderPartial/RenderPartialAsync,传递模型的方式和上面是一样的,第二个参数就是要传的模型对象。
内容的提问来源于stack exchange,提问作者User9895
相关产品推荐
相关产品推荐

