我将以下模型发送给我。
var some = new {thing = "poof"};
string output = some.thing;
在视图中,我并不想为我的对象指定任何特定的类(因为我希望现在保持它的灵活性和弹性)。因此, @Model 显然是一个对象,因此,它没有 url 属性。因此错误。
其他信息:'对象'不包含' url'
的定义
现在,我知道对象内的东西有 url 属性。我已将它分配给它,并且在观察变量时我也看到它,因为异常被抛出。
我的问题是如何访问该字段。我唯一的选择是声明一个类并使用 @model Something 键入模型?我无法使用作为关键字将其键入 var ...
" plain" C#我们可以做这样的事情。
select *
from song
where song_title = 'ing'
如何在Razor下的CSHTML文件中执行相当的操作?
答案 0 :(得分:2)
您可以使用ViewData
和ViewBag
将对象发送到视图页面,在这种情况下,您可以在控制器中写入如下内容:
ViewData["url"] = url ; //Or whatever
return View();
现在,您可以在视图中使用对象示例:<div>@ViewData["url"]</div>
但主要在 MVC 中,建议使用强类型 查看模型
答案 1 :(得分:2)
强类型视图模型是可行的方法。创建一个适合视图需求的类型,并将可重用性/重复视为次要问题。
但是,让我解释为什么你的尝试不起作用。
传递匿名类型是合法的 - 即使在程序集 [1] 之间 - 只要它被转换为object
。实际上,MVC框架程序集在许多辅助方法中使用匿名类型。然后使用反射(通过缓存优化)评估这些匿名类型。
1:我相信这有一些警告,在大多数情况下肯定不是好习惯。
视图被编译成一个类,以便可以执行。类合同的一部分是它所期望的模型类型,如视图标记中的@model
所示。
这会导致匿名类型出现问题,因为您无法在视图中指明其类型,并且类型object
未公开您在声明类型时设置的属性。因此,您最终得到的视图只知道其模型是一个对象。
同样,如果您真的只需要一个或两个值,请使用强类型模型或ViewBag。
但是,为了证明匿名类型可以传递给视图,请看这个(可怕的)示例:
<强>控制器强>
return View( new { property1 = "hello world"} );
查看强>
@model object
@{
var rvd = new RouteValueDictionary( Model );
}
@rvd["property1"]
我们将匿名类型作为对象传递给视图,然后使用RouteValueDictionary
读取对象的属性。
答案 2 :(得分:1)
您可能希望在C#中使用动态类型。有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/dd264736.aspx。
虽然标准是使用强类型视图模型,但在某些情况下,您可能希望使用动态作为模型类型(或作为强类型视图的属性)模型),例如在CMS中,CMS提供者动态构建属性。
示例视图:
@model dynamic
<p>
Url: @Model.url
</p>