【问题标题】:dynamic type in mvc view [duplicate]mvc视图中的动态类型[重复]
【发布时间】:2012-02-07 20:57:03
【问题描述】:

可能重复:
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。

【问题讨论】:

  • 由于反射,在调试过程中可以看到@Model属性...
  • 谢谢,为什么我会收到错误消息?该对象具有该属性,并且是动态类型!

标签: asp.net-mvc dynamic anonymous-types


【解决方案1】:

您显示的不是动态类型。它是一种匿名类型。有很大的不同。

您不能使用匿名类型作为模型。这是因为编译器将匿名类型作为 internal 发出。这意味着它们只能通过当前程序集访问。但正如您所知,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>

【讨论】:

  • 感谢您的解释。我想知道 ViewBag 是如何实现的?我可以有一个动态模型吗?这篇文章说这是可能的:blogs.msdn.com/b/rickandy/archive/2011/01/28/… 但我做不到。
  • @user654019,ViewBag 只是 ViewData 字典的动态包装器。您需要有一些具体的类型用作模型。您可以使用@model dnyamic,但如果此模型未指向特定类型(不是匿名对象,由于我在回答中概述的原因,它不能与匿名对象一起使用)它根本不起作用。在您链接的博客文章中,他们将动态模型指向他们定义的具体类,如BlogList&lt;Blog&gt;,所有这些都是强类型的。没有一个匿名对象。您可以在 ASP.NET MVC 中忘记它们。
  • 谢谢,你能给我一些关于 Viewbag 是如何实现的线索吗?有文件吗?
  • @user654019,非常简单,几行代码。它只是 ViewData 的一个包装器。您可以下载ASP.NET MVC 3 source code 并查看DynamicViewDataDictionary.cs 文件。它派生自 DynamicObject 并包装 ViewData,因此当您执行 ViewBag.Foo 时,它将调用底层的 ViewData["Foo"]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
相关资源
最近更新 更多