Dictionary需要一个System.Collections.Generic.List类型的模型项

本文关键字:List Generic Collections 类型 模型 System 一个 Dictionary | 更新日期: 2023-09-27 18:05:33

我有一个布局。csthml包含一个侧边栏,也包含一个@Renderbody。@Renderbody和侧边栏都在各自的视图中使用了以下内容:

@model List<appstowindows.Models.apps>
@foreach (var item in  Model){...}

两个视图渲染列表很好,但当我试图打开视图中的编辑URL时,我一直得到错误:

传入字典的模型项类型为System.Data.Entity。DynamicProxies, Dictionary需要一个模型项类型System.Collections.Generic.List

编辑url
@Html.ActionLink("Edit", "Edit", new { id = item.app_key }) 
指数

    public ActionResult Index()
    {
        var applist = db.apps.Include(a => a.appgroups);
        applist = db.apps.Include(a => a.appstatus);
        return View(applist.ToList());
    }

编辑
    public ActionResult Edit(int? id)
    {
        apps apps = db.apps.Find(id);
        return View(apps);
    }

重要提示:如果我在一个视图中删除其中一个列表,编辑URL工作正常。

是什么导致这个错误,如何解决?

更新:

@model myproject.Models.apps
@{
    ViewBag.Title = "Edit";
}
<h2>Edit</h2>
@using (Html.BeginForm("Edit", "Apps", null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
<div class="form-horizontal">
    <h4>apps</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.app_key)
</div>
}

Dictionary需要一个System.Collections.Generic.List类型的模型项

将错误类型的模型传递给视图。传递的对象类型为System.Data.Entity.DynamicProxies,而需要System.Collections.Generic.List。检查哪个对象作为参数提供给它。

更新:问题是与model指定在您的布局页面。Edit视图基于布局页面,因此需要List<apps>类型的模型才能呈现。但Edit视图需要apps作为另一侧的模型。虽然没有类型,但同时是List<apps>apps,您的代码将无法工作。

一般来说,您应该避免布局页面类型,因为基于该布局的所有视图都需要相同或后代类型的模型。如果您的所有页面都应该共享一些信息,您可以使用多个选项来解决这个问题:
  1. 第一个(也是最糟糕的)-基础视图模型类型,它将被用作布局的模型。在这个解决方案中,所有的视图(基于这个布局)应该有基本视图模型后代类型的模型,即所有的动作都必须获得基本视图模型以及视图模型本身的数据。
  2. 第二个(我将用它简单的情况下)-子操作,在你的布局中调用。它比以前更好,因为共享视图部分的数据应该只在子操作中检索一次,对视图模型类型没有限制,并且您的布局可以没有模型。它使用组合而不是继承,后者支持起来更简单,而且是一种更可取的制作方式(使用这种方法,您可以轻松地添加多个共享信息块,尝试使用第一个块实现它)。但是子动作在MVC中受到限制,它们不能是async(有一些hack使它们成为async,但这不是一个情况)
  3. 第三个(如果要显示多个共享信息块,我会使用它)-使用js延迟加载内容块。具有与前面相同的优点,但默认情况下可以使用async。此外,这些块不会延迟页面加载,可以用旋转器或其他方式装饰。

在你的情况下,错误是由@model List<appstowindows.Models.apps>引起的。当Edit视图执行时,它首先呈现布局页面标记,因此类型为apps的对象不适合作为模型提供给Edit视图。我想,你在你的布局中指定了一个类型,因为一些标记是在你所有的页面之间共享的(如果我错了,只是从你的布局中删除@model,一切都会好的),这种共享可以通过我之前提出的方法之一来实现。

如果你选择第二个,你应该在你的控制器中添加一个动作(不知道你渲染的是什么信息,所以我将其命名为Foo)

public ActionResult Foo()
{
    /*get data for your shared content part*/
    return PartialView(/*provide data here*/);
}

然后用标记为它创建View,这应该是共享的。(从你的布局,这导致问题)

@model List<appstowindows.Models.apps>
@foreach (var item in  Model){...}

然后从布局中删除该标记,并调用@Html.Action("Foo")。

顺便说一句,我想你应该学习一些关于ASP中布局页面和模型的信息。MVC,官方网站是一个很好的起点。