C# 传递到字典中的模型项的类型为。。但此词典需要类型为的模型项
添加此问题和社区wiki答案是为了帮助解决中讨论的大量未回答问题。C# 传递到字典中的模型项的类型为。。但此词典需要类型为的模型项,c#,asp.net-mvc,C#,Asp.net Mvc,添加此问题和社区wiki答案是为了帮助解决中讨论的大量未回答问题。 我有一些代码,当它执行时,会抛出一个异常,说: 传递到字典中的模型项的类型为Bar,但此字典需要类型为Foo的模型项 这意味着什么,我如何修复它?错误意味着您正在导航到一个视图,该视图的模型声明为typeofFoo(通过使用@model Foo),但实际上您传递了一个typeofBar(注意,之所以使用术语词典,是因为模型是通过ViewDataDictionary传递给视图的) 错误可能由以下原因引起: 将错误的模型从控制器方
我有一些代码,当它执行时,会抛出一个异常,说: 传递到字典中的模型项的类型为Bar,但此字典需要类型为Foo的模型项
这意味着什么,我如何修复它?错误意味着您正在导航到一个视图,该视图的模型声明为typeof
Foo
(通过使用@model Foo
),但实际上您传递了一个typeofBar
(注意,之所以使用术语词典,是因为模型是通过ViewDataDictionary
传递给视图的)
错误可能由以下原因引起:
将错误的模型从控制器方法传递到视图(或局部视图)
常见示例包括使用创建匿名对象(或匿名对象集合)的查询并将其传递给视图
var model=db.Foos.Select(x=>new
{
ID=x.ID,
Name=x.Name
};
返回视图(模型);//将匿名对象传递给使用@model Foo声明的视图
或者将一组对象传递给需要单个对象的视图
var模型=db.Foos.Where(x=>x.ID==ID);
返回视图(模型);//将IEnumerable传递给使用@model Foo声明的视图
通过在控制器中显式声明模型类型以匹配视图中的模型,而不是使用var
,可以在编译时轻松识别错误
将错误模型从视图传递到局部视图
@model IEnumerable<WFAccess.Models.ViewModels.SiteViewModel>
<div class="row">
<table class="table table-striped table-hover table-width-custom">
<thead>
<tr>
....
给定以下模型
公共类Foo
{
公共栏MyBar{get;set;}
}
以及使用@model Foo
声明的主视图和使用@model Bar
声明的局部视图,然后
Foo model=db.Foos.Where(x=>x.ID==ID).Include(x=>x.Bar).FirstOrDefault();
返回视图(模型);
将向主视图返回正确的模型。但是,如果视图包含
@Html.Partial(“\u-Bar”)//或@Html.RenderPartial(\u-Bar”)}
默认情况下,传递到局部视图的模型是在主视图中声明的模型,您需要使用
@Html.Partial('u-Bar',Model.MyBar)//或@Html.RenderPartial('u-Bar',Model.MyBar);}
要将Bar
的实例传递给部分视图,请注意,如果MyBar
的值为null
(尚未初始化),则默认情况下Foo
将传递给部分视图,在这种情况下,需要对其进行初始化
@Html.Partial(“\u-Bar”,new-Bar())
在布局中声明模型
如果布局文件包含模型声明,则使用该布局的所有视图都必须声明相同的模型或从该模型派生的模型
如果要在版面中包含单独模型的html,则在版面中,使用
@html.Action(…)
调用[ChildActionOnly]
方法初始化该模型并返回其部分视图。该错误表示您正在导航到其模型声明为typeofFoo
(通过使用@model Foo
),但实际上您向它传递了一个类型为Bar
的模型(请注意,之所以使用术语dictionary,是因为模型是通过ViewDataDictionary
传递到视图的)
错误可能由以下原因引起:
将错误的模型从控制器方法传递到视图(或局部视图)
常见示例包括使用创建匿名对象(或匿名对象集合)的查询并将其传递给视图
var model=db.Foos.Select(x=>new
{
ID=x.ID,
Name=x.Name
};
返回视图(模型);//将匿名对象传递给使用@model Foo声明的视图
或者将一组对象传递给需要单个对象的视图
var模型=db.Foos.Where(x=>x.ID==ID);
返回视图(模型);//将IEnumerable传递给使用@model Foo声明的视图
通过在控制器中显式声明模型类型以匹配视图中的模型,而不是使用var
,可以在编译时轻松识别错误
将错误模型从视图传递到局部视图
@model IEnumerable<WFAccess.Models.ViewModels.SiteViewModel>
<div class="row">
<table class="table table-striped table-hover table-width-custom">
<thead>
<tr>
....
给定以下模型
公共类Foo
{
公共栏MyBar{get;set;}
}
以及使用@model Foo
声明的主视图和使用@model Bar
声明的局部视图,然后
Foo model=db.Foos.Where(x=>x.ID==ID).Include(x=>x.Bar).FirstOrDefault();
返回视图(模型);
将向主视图返回正确的模型。但是,如果视图包含
@Html.Partial(“\u-Bar”)//或@Html.RenderPartial(\u-Bar”)}
默认情况下,传递到局部视图的模型是在主视图中声明的模型,您需要使用
@Html.Partial('u-Bar',Model.MyBar)//或@Html.RenderPartial('u-Bar',Model.MyBar);}
要将Bar
的实例传递给部分视图,请注意,如果MyBar
的值为null
(尚未初始化),则默认情况下Foo
将传递给部分视图,在这种情况下,需要对其进行初始化
@Html.Partial(“\u-Bar”,new-Bar())
在布局中声明模型
如果布局文件包含模型声明,则使用该布局的所有视图都必须声明相同的模型或从该模型派生的模型
如果要在版面中包含单独模型的html,则在版面中,使用@html.Action(…)
调用[ChildActionOnly]
方法初始化该模型并返回部分视图
public class Foo
{
public string FooName { get; set; }
public List<Bar> Bars { get; set; }
}
public class Bar
{
public string BarName { get; set; }
}
@model Foo
@Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
@Html.EditorFor(m => m.Bars)
@model List<Bar>
<div class="some-style">
@foreach (var item in Model)
{
<label>@item.BarName</label>
}
</div>
@model Foo
@Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
<div class="some-style">
@Html.EditorFor(m => m.Bars)
</div>
@model Bar
<label>@Model.BarName</label>