【问题标题】:Why do I get System.NullReferenceException when I use Html.EditorFor [duplicate]为什么我在使用 Html.EditorFor 时会收到 System.NullReferenceException [重复]
【发布时间】:2020-09-17 17:21:15
【问题描述】:

我的行动是

public ActionResult Login(string returnUrl)
{
    ViewBag.returnUrl = returnUrl;
    return View();
}

在视图中我定义了模型@model OnlineShop.Models.ViewModels.LoginModel,当我使用助手@Html.EditorFor(m => m.UserName) 时,我得到System.NullReferenceException

当我想使用Html.EditorFor() 时,我真的需要在return View(new LoginModel()) 之类的操作中传递我的模型实例吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc model-view-controller


    【解决方案1】:

    是的。

    当您在视图顶部使用@model type 指令时,您是在告诉框架它可以期待该类型的实例。 HTML 助手(例如Html.DisplayForHtml.EditorFor 等)都基于您提供的模型类型。如果您打开视图并将鼠标光标悬停在EditorFor 上,您可以看到这一点。你会看到这样的东西:

    string IHtmlHelper<OnlineShop.Models.ViewModels.LoginModel>.DisplayNameFor<string>(
        System.Linq.Expressions.Expression<Func<OnlineShop.Models.ViewModels.LoginModel, string>> expression)
    

    请注意,该方法是通用的并且基于OnlineShop.Models.ViewModels.LoginModel。这是因为这些方法期望您将 OnlineShop.Models.ViewModels.LoginModel 的实例传递给您的视图,正如您在视图顶部使用 @model 指令所说的那样。

    不,因为我知道这个异常意味着什么,但我不知道为什么我会在这种特殊情况下得到它。例如对于 Html.LabelFor 它工作正常。

    它适用于LabelFor 的原因是因为LabelFor 正在查看模型的元数据,而不是需要它的实例。默认情况下,它只是创建一个带有您传递给它的属性名称的标签。在您的情况下,如果您调用 @Html.LabelFor(m =&gt; m.Username),它将创建一个标签 HTML 元素,其文本为 Username,但它不需要您的视图模型实例来执行此操作。

    另一方面,

    EditorFor 正在查看您的 Username 属性的元数据,以创建适当的输入 HTML 元素(例如,字符串的文本框或布尔值的复选框),并且还使用Username 属性的值以填充该编辑器(例如选中复选框)。这就是为什么在没有给它一个模型实例的情况下调用 Html.EditorFor(m =&gt; m.Username) 时会出现异常的原因。

    【讨论】:

    • @Qwertyluk Html.LabelFor 将始终在没有模型的情况下工作,只要您在视图中指定 @model 指令以告诉框架您的模型类型是什么。此时,任何对Html.LabelFor 的调用都会检查模型type 以确定要渲染的内容——它不需要该类型的instance
    • 我在另一台机器上也有相同的代码,它工作正常。为什么它在那里工作似乎很奇怪。
    【解决方案2】:

    查看https://docs.microsoft.com/en-us/aspnet/core/mvc/views/overview?view=aspnetcore-3.1#passing-data-to-views

    为了将模型提供给视图,控制器将其作为参数传递:

    public IActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";
    
        var viewModel = new Address()
        {
            Name = "Microsoft",
            Street = "One Microsoft Way",
            City = "Redmond",
            State = "WA",
            PostalCode = "98052-6399"
        };
    
        return View(viewModel);
    }
    

    还要检查视图的定义:https://docs.microsoft.com/en-us/dotnet/api/system.web.mvc.controller.view?view=aspnet-mvc-5.2

    您需要使用带有对象的视图来将数据返回给视图。请小心,因为单独的字符串被视为视图名称。

    【讨论】:

      【解决方案3】:

      简短的回答:是的,您的操作必须为您的模型提供视图的实例。

      @model OnlineShop.Models.ViewModels.LoginModel 通知视图期望模型属于该类型,并且它将由控制器传递给视图。 LoginModel 是一个类,它的默认值为 null。

      【讨论】:

        猜你喜欢
        • 2021-08-10
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 2017-12-21
        • 2022-09-27
        • 2020-05-01
        • 2010-12-31
        • 1970-01-01
        相关资源
        最近更新 更多