我有一个layout.csthml,它包含一个侧边栏,还包含一个@Renderbody。 @Renderbody和侧边栏都在其各自的视图中使用以下内容。
@model List<appstowindows.Models.apps>
@foreach (var item in Model){...}
两个视图都可以很好地呈现列表,但是当我尝试在视图中打开编辑URL时,我不断收到错误:
传递到字典中的模型项是类型的 System.Data.Entity.DynamicProxies,Dictionary需要一个模型项 键入System.Collections.Generic.List
修改网址
@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);
}
重要说明:如果我要删除其中一个视图中的任何一个列表,编辑网址就可以正常工作。
导致此错误的原因是什么以及如何解决?
更新:
@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>
}
答案 0 :(得分:2)
您正在将错误类型的模型传递给您的视图。传递的对象属于System.Data.Entity.DynamicProxies
类型,而System.Collections.Generic.List
是必需的。检查提供哪个对象作为参数。
更新:
问题出在布局页面上指定model
。 Edit
视图基于布局页面,因此需要能够呈现List<apps>
类型的模型。但Edit
视图需要apps
作为对方的模型。虽然没有类型,同时List<apps>
和apps
,但您的代码将无效。
通常,您应该避免布局页面输入,因为基于该布局的所有视图都需要相同或后代类型的模型。 如果您的所有页面都应该真正共享一些信息,您可以通过多种选项解决此问题:
async
(有一些黑客可以使它们成为async
,但事实并非如此)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中学习一些关于布局页面和模型的信息,官方website是一个很好的起点。