[英]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文件中执行等效操作?
您可以使用ViewData
和ViewBag
将对象发送到视图页面,在这种情况下,您可以在控制器中编写如下内容:
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.