Asp.net RazorPages:viewData中未定义的键未引发异常

Asp.net RazorPages:viewData中未定义的键未引发异常,asp.net,razor,razor-pages,Asp.net,Razor,Razor Pages,我在ASP.NET core中使用Razor页面作为学习练习,当我尝试在viewData中使用未定义的键时,我注意到没有引发异常。我想这是有意的,但我想。。。为什么?我该如何检测这些错误呢?似乎打字很容易,而且很难在太晚之前注意到。例如: using System.Collections.Generic; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; namespace Infoda

我在ASP.NET core中使用Razor页面作为学习练习,当我尝试在viewData中使用未定义的键时,我注意到没有引发异常。我想这是有意的,但我想。。。为什么?我该如何检测这些错误呢?似乎打字很容易,而且很难在太晚之前注意到。例如:

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;

namespace Infodawn.Pages
{
    public class IndexModel : PageModel
    {
        private readonly ILogger<IndexModel> _logger;

        public IndexModel(ILogger<IndexModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {
            // doesn't throw exception, even though viewData["bar"] is undefined:
            ViewData["foo"] = ViewData["bar"];

            // throws exception, as expected:
            Dictionary<string, int> dict = new Dictionary<string, int>();
            int a = dict["bar"];
        }
    }
}
使用System.Collections.Generic;
使用Microsoft.AspNetCore.Mvc.RazorPages;
使用Microsoft.Extensions.Logging;
命名空间Infodawn.Pages
{
公共类索引模型:PageModel
{
专用只读ILogger\u记录器;
公共索引模型(ILogger记录器)
{
_记录器=记录器;
}
公共互联网
{
//即使viewData[“bar”]未定义,也不会引发异常:
ViewData[“foo”]=ViewData[“bar”];
//按预期引发异常:
Dictionary dict=新字典();
int a=dict[“bar”];
}
}
}

如果未设置ViewData项,则该项将为
null
。因此,在尝试使用ViewData项之前,应测试null:

if(ViewData["bar"] != null)
{
    //
}
当使用任何依赖于“魔术字符串”(例如字符串索引器)的API时,存在输入错误进入代码并导致错误等固有风险。一种通用解决方案是使用常量来表示键值

在Razor页面中,建议使用将数据从控制器传递到视图,而不是ViewData