C# 在Razor页面中,是否可以对ViewData使用点表示法?

C# 在Razor页面中,是否可以对ViewData使用点表示法?,c#,dictionary,razor-pages,C#,Dictionary,Razor Pages,我正在使用Razor页面并尝试从ViewData访问属性: @{ ViewData["Property"] = "Value"; } 我知道这是可行的: <h1>@ViewData["Property"] @ViewData[“属性”] 但是,当我尝试使用点符号访问应用程序时,应用程序崩溃: <h1>@ViewData.Property</h1> @ViewData.Property 为什么会这样 我知道点表示法适用于ViewBag,因为它允

我正在使用Razor页面并尝试从
ViewData
访问属性:

@{
    ViewData["Property"] = "Value";
}
我知道这是可行的:

<h1>@ViewData["Property"]
@ViewData[“属性”]
但是,当我尝试使用点符号访问应用程序时,应用程序崩溃:

<h1>@ViewData.Property</h1>
@ViewData.Property
为什么会这样


我知道点表示法适用于
ViewBag
,因为它允许我动态访问属性。

ViewData
ViewDataDictionary
类型的对象,实际上是
IDictionary
,而
ViewBag
动态的
dynamic
允许使用点表示法,而C#中的dictionary只允许通过
[key]
获取值,因此您的应用程序崩溃,因为
ViewDataDictionary
中没有这样的属性,即使有这样的键。

ViewData是IDictionary,这意味着您可以使用key(ViewData)访问数据[yourkey])。但您的担心也是正确的,我们希望访问该属性,以便降低某些队友键入密钥错误的风险


出于这个原因,我总是更喜欢使用@Model.YourProperty。接下来的问题是,如果您为所有页面(如Languague、LoginName等)提供了一个常用字段,那么我建议使用一个基本模型来包含所有这些属性。所有页面模型都需要继承/实现这些属性。

为什么您可以
查看数据[“属性”]
但是您不能执行
int age=20;if(age.IsLegal){…}
。同样的原因:类型不支持它,因为它们是不同的东西。