dotnet
type_error
ai_generated
true
System.InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'X', but this ViewDataDictionary instance requires a model item of type 'Y'.
ID: dotnet/razor-page-view-data-dictionary
95%Fix Rate
88%Confidence
1Evidence
2023-03-10First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| .NET 6.0 | active | — | — | — |
| .NET 7.0 | active | — | — | — |
| .NET 8.0 | active | — | — | — |
| ASP.NET Core 6.0 | active | — | — | — |
| ASP.NET Core 7.0 | active | — | — | — |
| ASP.NET Core 8.0 | active | — | — | — |
Root Cause
ASP.NET Core Razor Page or View expects a strongly-typed model of type Y, but the controller or page handler passes a model of type X, causing a type mismatch in ViewDataDictionary.
generic中文
ASP.NET Core Razor 页面或视图期望类型为 Y 的强类型模型,但控制器或页面处理程序传递了类型为 X 的模型,导致 ViewDataDictionary 中的类型不匹配。
Official Documentation
https://learn.microsoft.com/en-us/aspnet/core/mvc/views/overviewWorkarounds
-
95% success Ensure the controller action returns a ViewResult with the correct model type: return View(modelOfTypeY); where modelOfTypeY is of the type declared in the view's @model directive.
Ensure the controller action returns a ViewResult with the correct model type: return View(modelOfTypeY); where modelOfTypeY is of the type declared in the view's @model directive.
-
85% success If the view must accept multiple types, change the @model directive to a base class or interface that both X and Y implement, then adjust the view accordingly.
If the view must accept multiple types, change the @model directive to a base class or interface that both X and Y implement, then adjust the view accordingly.
-
90% success Use a ViewModel that contains both X and Y as properties, and pass that ViewModel to the view.
Use a ViewModel that contains both X and Y as properties, and pass that ViewModel to the view.
中文步骤
确保控制器操作返回正确模型类型的 ViewResult:return View(modelOfTypeY); 其中 modelOfTypeY 的类型与视图的 @model 指令声明的类型一致。
如果视图必须接受多种类型,将 @model 指令改为 X 和 Y 都实现的基类或接口,然后相应调整视图。
使用包含 X 和 Y 作为属性的 ViewModel,并将该 ViewModel 传递给视图。
Dead Ends
Common approaches that don't work:
-
Change the @model directive in the view to match the passed type X
85% fail
This breaks the view's contract with its expected model type; the view may use properties of Y that don't exist on X, causing runtime errors.
-
Use ViewBag or ViewData to pass the model instead of a strongly-typed model
70% fail
This defeats the purpose of strongly-typed views and can lead to runtime casting errors and loss of IntelliSense.
-
Cast the model to type Y in the controller
90% fail
If X and Y are unrelated types, casting will throw InvalidCastException at runtime.