ASP.NET Core 8:ViewDataDictionary模型类型不匹配异常求助
问题:InvalidOperationException模型类型不匹配
InvalidOperationException: 传入ViewDataDictionary的模型项类型为'System.Collections.Generic.List`1[BookingPortal.Models.ViewModels.WarehouseViewModel]',但该ViewDataDictionary实例要求模型项类型为'BookingPortal.Models.ViewModels.WarehouseViewModel'。
我传递的模型类型和视图声明的类型看起来一致,但出现了上述异常,请求排查原因并解决。
控制器代码
public IActionResult B2bBookingInsert() { ViewData["Title"] = "New Booking"; List<WarehouseViewModel> warehouse = bookingPortalService. GetWarehousesToChoseForInsert(); return View("B2bWarehouseSelection" , warehouse); }
应用服务代码
public List<WarehouseViewModel> GetWarehousesToChoseForInsert() { string query = "SELECT * from Warehouse"; DataSet dataset = db.Query(query); var dataTable = dataset.Tables[0]; var warehouseList = new List<WarehouseViewModel>(); foreach (DataRow warehouseRow in dataTable.Rows) { WarehouseViewModel warehouse = WarehouseViewModel.FromDataRow(warehouseRow); warehouseList.Add(warehouse); } return warehouseList; }
ViewModel:WarehouseViewModel
namespace BookingPortal.Models.ViewModels; public class WarehouseViewModel { public int IdWarehouse {get; set;} public int Client {get; set;} public string? WarehouseCode {get; set;} public string? Descritpion {get; set;} public string? Street {get; set;} public string? Locality {get; set;} public string? Cap {get; set;} public string? City {get; set;} public string? Nation {get; set;} public string? Telephone {get; set;} public string? Email {get; set;} public string? ActiveWeb {get; set;} public string? Active {get; set;} public string? Interlocutor {get; set;} public string? Latitude {get; set;} public string? Longitude {get; set;} public string? ActiveLoad {get; set;} public string? ActiveUnload {get; set;} public string? WarehouseInformationInSelect {get; set;} public static WarehouseViewModel FromDataRow(DataRow warehouseRow) { var warehouseViewModel = new WarehouseViewModel { IdWarehouse = Convert.ToInt32(warehouseRow["IdWarehouse"]), Client = Convert.ToInt32(warehouseRow["Client"]), WarehouseCode = Convert.ToString(warehouseRow["WarehouseCode"]), Descritpion = Convert.ToString(warehouseRow["Descritpion"]), Street = Convert.ToString(warehouseRow["Street"]), Locality = Convert.ToString(warehouseRow["Locality"]), Cap = Convert.ToString(warehouseRow["Cap"]), City = Convert.ToString(warehouseRow["City"]), Nation = Convert.ToString(warehouseRow["Nation"]), Telephone = Convert.ToString(warehouseRow["Telephone"]), Email = Convert.ToString(warehouseRow["Email"]), Interlocutor = Convert.ToString(warehouseRow["Interlocutor"]), Latitude = Convert.ToString(warehouseRow["Latitude"]), ActiveLoad = Convert.ToString(warehouseRow["ActiveLoad"]), ActiveUnload = Convert.ToString(warehouseRow["ActiveUnload"]), WarehouseInformationInSelect = Convert.ToString(warehouseRow["Descritpion"]) + " , " + Convert.ToString(warehouseRow["Street"]) + " , " + Convert.ToString(warehouseRow["Locality"]) + " , " + Convert.ToString(warehouseRow["City"]) + " , " + Convert.ToString(warehouseRow["Cap"]) }; return warehouseViewModel; } }
视图:B2bWarehouseSelection(已简化)
@model List<WarehouseViewModel> @{ ViewData["Title"] = "New Booking"; } @foreach (var Item in Model) { <div>Warehouse</div> }
排查方向与解决方案
1. 确认视图文件的实际模型声明
你提供的简化视图声明的是List<WarehouseViewModel>,但实际运行的视图可能并非这个文件。检查以下几点:
- 确保修改的是当前控制器对应Views文件夹下的
B2bWarehouseSelection.cshtml,而非其他位置的同名文件 - 打开视图文件,确认
@model指令的命名空间完整,比如是否是@model List<BookingPortal.Models.ViewModels.WarehouseViewModel>(如果视图顶部没有@using BookingPortal.Models.ViewModels,则需要完整命名空间)
2. 避免视图查找歧义
ASP.NET MVC在查找视图时会优先检查Shared文件夹,再检查当前控制器的Views文件夹。如果Shared文件夹下存在同名的B2bWarehouseSelection.cshtml,且该视图的模型是单个WarehouseViewModel,就会导致报错。
- 删除或修改
Shared文件夹下的同名视图,或者在控制器返回视图时指定完整路径:// 替换[YourControllerName]为实际控制器名称 return View("~/Views/[YourControllerName]/B2bWarehouseSelection.cshtml", warehouse);
3. 清理缓存并重新编译
有时候项目缓存会导致视图未更新,执行以下操作:
- 清理项目的bin和obj文件夹
- 重新编译整个解决方案
- 重启IIS Express或本地开发服务器
内容的提问来源于stack exchange,提问作者MarcoD
相关产品推荐
相关产品推荐

