加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 00:04:21 所属栏目:asp.Net 来源:网络整理
导读:Possible Duplicate: 07000 我试图在我的MVC应用程序中使用动态类型模型.我有以下代码: 在控制器中: var model = new { Name = "test name",Family = "m" };return this.View(model); 在我看来,我有: @model dynamic@if(Model!=null){ p @Html.Raw(Model.

Possible Duplicate:
07000

我试图在我的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的属性.

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读