asp.net-mvc – mvc视图中的动态类型

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – mvc视图中的动态类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Possible Duplicate:
07000

我试图在我的MVC应用程序中使用动态类型模型.我有以下代码
在控制器中:

@H_301_12@var model = new { Name = "test name",Family = "m" }; return this.View(model);

在我看来,我有:

@H_301_12@@model dynamic @if(Model!=null) { <p> @Html.Raw(Model.Name) </p> }

当我运行这个时,我收到以下错误

@H_301_12@'object' does not contain a definition for 'Name' (System.Exception {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException)

为什么我会收到此错误
在调试期间,如果我将光标放在@Model上,我可以看到它有两个名为Name和Family的属性.

解决方法

@H_301_28@ 你所展示的不是动态类型.这是一种匿名类型.这是一个巨大的差异.

您不能将匿名类型用作模型.这是因为编译器将匿名类型作为内部发出.这意味着只能使用当前程序集访问它们.但是正如您所知,Razor视图由ASP.NET运行时编译为单独的程序集,无法使用这些匿名类型.

显然,在这种情况下,正确的方法是使用视图模型:

@H_301_12@public class Myviewmodel { public string Name { get; set; } public string Family { get; set; } }

然后让控制器操作将此视图模型传递给视图:

@H_301_12@var model = new Myviewmodel { Name = "test name",Family = "m" }; return this.View(model);

以便您的视图可以使用它:

@H_301_12@@model Myviewmodel @if (Model != null) { <p>@Model.Name</p> }

有些人(不是我,我永远不会推荐这样的东西)也使用ViewBag,这样他们就不需要模型了:

@H_301_12@ViewBag.Name = "test name"; ViewBag.Family = "m"; return this.View();

然后在视图中:

@H_301_12@<p>@ViewBag.Name</p>

猜你在找的asp.Net相关文章