当我使用 Html.EditorFor 时,为什么会出现 System.NullReferenceException

Qwe*_*luk 2 c# asp.net model-view-controller asp.net-mvc

我的行动是

public ActionResult Login(string returnUrl)
{
    ViewBag.returnUrl = returnUrl;
    return View();
}
Run Code Online (Sandbox Code Playgroud)

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

我是否真的需要在操作中传递模型的实例,就像return View(new LoginModel())我想使用时一样Html.EditorFor()

Joh*_*n H 5

是的。

当您使用@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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

EditorFor另一方面,既查看属性的元数据Username,创建适当的输入 HTML 元素(例如字符串的文本框,或布尔值的复选框),也使用属性的值Username来填充该编辑器(例如选中复选框)。Html.EditorFor(m => m.Username)这就是为什么当您没有为其提供模型实例时调用时会出现异常的原因。