可能重复:
Dynamic Anonymous type in Razor causes RuntimeBinderException
我试图在我的MVC应用程序中使用动态类型模型。我有以下代码: 在控制器中:
var model = new { Name = "test name", Family = "m" };
return this.View(model);
在视图中我有:
@model dynamic
@if(Model!=null)
{
<p> @Html.Raw(Model.Name) </p>
}
当我运行时,我收到以下错误:
'object' does not contain a definition for 'Name' (System.Exception {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException)
为什么会出现此错误? 在调试期间,如果我将光标放在@Model上,我可以看到它有两个名为Name和Family的属性。
答案 0 :(得分:16)
您展示的不是动态类型。这是一种匿名类型。这是一个巨大的差异。
您不能将匿名类型用作模型。原因是编译器将匿名类型作为内部发出。这意味着只能使用当前程序集访问它们。但正如您所知,Razor视图由ASP.NET运行时编译为单独的程序集,无法使用这些匿名类型。
显然,在这种情况下,正确的方法是使用视图模型:
public class MyViewModel
{
public string Name { get; set; }
public string Family { get; set; }
}
然后让您的控制器操作将此视图模型传递给视图:
var model = new MyViewModel { Name = "test name", Family = "m" };
return this.View(model);
以便您的观点可以使用它:
@model MyViewModel
@if (Model != null)
{
<p>@Model.Name</p>
}
有些人(不是我,我绝不会推荐这样的东西)也使用ViewBag
,这样他们就不需要模型了:
ViewBag.Name = "test name";
ViewBag.Family = "m";
return this.View();
然后在视图中:
<p>@ViewBag.Name</p>