You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:25:46