RazorPages:viewData 中的未定义键未抛出异常

RazorPages: undefined key in viewData not throwing exception

我正在 ASP.NET 核心中使用 Razor Pages 作为学习练习,当我尝试在 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"];
        }
    }
}

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

if(ViewData["bar"] != null)
{
    //
}

在使用依赖于 "magic string" 的任何 API 时(例如字符串索引器),存在打字错误进入代码并导致错误等的固有风险。一个通用的解决方案是使用常量来表示键值。

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