繁体   English   中英

如何访问传递给视图的模型中的属性?

[英]How to access properties in the model passed to the view?

我将以下模型发送到我的视图。

return View(new { url = returnUrl });

在视图中,我不想为我的对象指定任何特定的类(因为我现在希望保持其灵活和有弹性)。 因此,@ Model显然是一个对象,因此没有url属性。 因此,错误。

附加信息:“对象”不包含“ URL”的定义

现在,我知道对象内部的东西具有url属性。 我已经将其分配给它,并且在查看变量时也看到了它,因为抛出了异常。

我的问题是如何访问该字段。 我唯一的选择是声明一个类并使用@model Something键入模型吗? 我不能使用as关键字将其键入var ...

在“普通” C#中,我们可以执行以下操作。

var some = new {thing = "poof"};
string output = some.thing;

如何在Razor下的CSHTML文件中执行等效操作?

您可以使用ViewDataViewBag将对象发送到视图页面,在这种情况下,您可以在控制器中编写如下内容:

ViewData["url"] = url ; //Or whatever 
return View();

现在,在视图中,您可以简单地使用对象示例: <div>@ViewData["url"]</div>

但主要在MVC中 ,更建议使用强类型的 视图模型

强类型的视图模型是要走的路。 创建适合视图需求的类型,并将可重用性/重复性视为次要关注点。

但是,让我解释一下为什么您的尝试不起作用。

只要将匿名类型强制转换为object这是合法的,即使在程序集[1]之间也是如此。 实际上,MVC框架程序集在许多辅助方法中使用匿名类型。 然后使用反射(通过缓存优化)评估那些匿名类型。

1:我相信对此有一些警告,在大多数情况下,这当然不是一个好习惯。

视图被编译到一个类中,以便可以执行它。 类合同的一部分是它期望的模型类型,如视图标记中的@model所示。

这给匿名类型带来了一个问题,因为您不能在视图中指示它们的类型,并且类型object不会在声明类型时公开您设置的属性。 因此,最终得到的视图仅知道其模型是一个对象。

同样,如果确实只需要一个或两个值,请使用强类型模型或ViewBag。

然而,为了证明匿名类型可以被传递到视图,看看这个(恐怖)例如:

控制者

return View( new { property1 = "hello world"} );

视图

@model object
@{
    var rvd = new RouteValueDictionary( Model );
}

@rvd["property1"]

我们将匿名类型作为对象传递给视图,然后使用RouteValueDictionary读取对象的属性。

您可能需要研究在C#中使用动态类型。 有关详细信息,请参见https://msdn.microsoft.com/zh-cn/library/dd264736.aspx

虽然标准是使用强类型的视图模型,但在某些情况下,您可能希望将动态用作模型类型(或作为强类型的视图模型的属性),例如在CMS中,属性是由CMS提供程序动态构建的。

示例视图:

@model dynamic
<p>
    Url:  @Model.url
</p>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM