C# 在Razor页面中,是否可以对ViewData使用点表示法?
我正在使用Razor页面并尝试从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,因为它允
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){…}
。同样的原因:类型不支持它,因为它们是不同的东西。