代码之家  ›  专栏  ›  技术社区  ›  abdul qayyum

ASP MVC模型冲突[重复]

  •  0
  • abdul qayyum  · 技术社区  · 6 年前

    添加了此问题和社区wiki答案,以帮助解决在 this meta post .


    我有一些代码,当它执行时,会抛出一个异常:

    传递到字典中的模型项为Bar类型,但此字典需要Foo类型的模型项

    这是什么意思,我该怎么解决?

    0 回复  |  直到 8 年前
        1
  •  79
  •   Stephen Muecke    8 年前

    该错误意味着您正在导航到模型声明为typeof的视图 Foo @model Foo ),但实际上你给它传递了一个 Bar (注意术语 词典 因为模型通过 ViewDataDictionary ).

    将错误的模型从控制器方法传递到视图(或部分视图)

    常见的示例包括使用创建匿名对象(或匿名对象集合)的查询并将其传递给视图

    var model = db.Foos.Select(x => new
    {
        ID = x.ID,
        Name = x.Name
    };
    return View(model); // passes an anonymous object to a view declared with @model Foo
    

    或者将一组对象传递给期望单个对象的视图

    var model = db.Foos.Where(x => x.ID == id);
    return View(model); // passes IEnumerable<Foo> to a view declared with @model Foo
    

    通过在控制器中显式声明模型类型以匹配视图中的模型,而不是使用 var

    将错误的模型从视图传递到部分视图

    给出以下模型

    public class Foo
    {
        public Bar MyBar { get; set; }
    }
    

    以及一个主视图 以及声明为 @model Bar ,然后

    Foo model = db.Foos.Where(x => x.ID == id).Include(x => x.Bar).FirstOrDefault();
    return View(model);
    

    @Html.Partial("_Bar") // or @{ Html.RenderPartial("_Bar"); }
    

    默认情况下,传递给部分视图的模型是在主视图中声明的模型,您需要使用

    @Html.Partial("_Bar", Model.MyBar) // or @{ Html.RenderPartial("_Bar", Model.MyBar); }
    

    传递的实例 酒吧 MyBar null (尚未初始化),则默认情况下 将被传递给partial,在这种情况下,它需要

    @Html.Partial("_Bar", new Bar())
    

    在布局中声明模型

    如果布局文件包含模型声明,则使用该布局的所有视图都必须声明同一模型或从该模型派生的模型。

    如果要在布局中包含单独模型的html,则在布局中使用 @Html.Action(...) [ChildActionOnly] 方法初始化该模型并返回其部分视图。

        2
  •  5
  •   Banana Random Dev    5 年前

    观察视图是否具有所需的模型:

    @model IEnumerable<WFAccess.Models.ViewModels.SiteViewModel>
    
    <div class="row">
        <table class="table table-striped table-hover table-width-custom">
            <thead>
                <tr>
    ....
    

    控制器

    [HttpGet]
    public ActionResult ListItems()
    {
        SiteStore site = new SiteStore();
        site.GetSites();
    
        IEnumerable<SiteViewModel> sites =
            site.SitesList.Select(s => new SiteViewModel
            {
                Id = s.Id,
                Type = s.Type
            });
    
        return PartialView("_ListItems", sites);
    }
    

    在我的例子中,我使用一个局部视图,但是在普通视图中运行

        3
  •  4
  •   Hooman Bahreini    6 年前

    这个问题已经有了一个很好的答案,但是在另一个场景中,我遇到了同样的错误:显示 List 在一个 编辑模板

    我有一个这样的模型:

    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)
    

    这是我的酒吧 编辑模板 ( 条形图.cshtml )

    @model List<Bar>
    
    <div class="some-style">
        @foreach (var item in Model)
        {
            <label>@item.BarName</label>
        }
    </div>
    

    我犯了个错误:

    字典需要类型为的模型项 'System.Collections.Generic.List`1[栏]


    这个错误的原因是 EditorFor 已经迭代了 列表 对于您,因此如果将集合传递给它,它将为集合中的每个项显示一次编辑器模板。

    我就是这样解决这个问题的:

    将样式置于编辑器模板之外,并 主视图

    @model Foo
    
    @Html.TextBoxFor(m => m.Name, new { @class = "form-control" })  
    <div class="some-style">
        @Html.EditorFor(m => m.Bars)
    </div>
    

    改变了 编辑模板 ( 条形图.cshtml

    @model Bar
    
    <label>@Model.BarName</label>