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

时间:2016-04-05 21:08:08

标签: c# asp.net-mvc razor abstract-data-type

我将以下模型发送给我。

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文件中执行相当的操作?

3 个答案:

答案 0 :(得分:2)

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

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>