Html.TextBoxFor NullReferenceException 使用 Razor 语法

And*_*age 7 c# asp.net asp.net-mvc razor

我有一个非常简单的页面(我已将其减少到几乎没有内容,以查看是否可以使其正常工作)。使用Html.TextBoxFor如下所示的 lambda调用时抛出 NullReferenceException 。我想弄清楚这是为什么?

异常本身似乎已被处理,因为它不会停止呈现页面,但我认为它根本不应该发生?文本框实际上按预期正确呈现(使用正则表达式和占位符)。

如果我换TextBoxForPasswordFor一个 NullReferenceException 也不会抛出。

看法:

@model Analytics.Sites.Frontend.Models.RegisterViewModel
<div>
    @using (Html.BeginForm("Register", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "centeralign", role = "form" }))
    {
        @Html.TextBoxFor(m => m.Email, new { @placeholder = "email@address.com" })
    }

</div>
Run Code Online (Sandbox Code Playgroud)

视图模型

public class RegisterViewModel
{
    [Required]
    [Display(Name = "Email")]
    [DataType(DataType.EmailAddress)]
    [RegularExpression(@"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", ErrorMessage = "The email address you entered is not valid.")]
    public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

例外:

System.NullReferenceException
   at lambda_method(Closure , RegisterViewModel )
Run Code Online (Sandbox Code Playgroud)

想法?这是设计使然吗,它在内部抛出并捕获 NullReferenceException?

编辑:

控制器本身是空的。

[Authorize]
public class AccountController : Controller
{
   [AllowAnonymous]
    public ActionResult Register()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这不是将模型实例传递给视图。更改为return View(new RegisterViewModel)将否定 NRE。这是这样做的预期方式吗?样本另有说明。

如果您使用 VS2013 创建一个新的 MVC 框架项目,它在 Account/Register 方法上具有与此相同的代码。骨架项目也抛出(一个句柄?)相同的 NRE。可能这是设计使然?

Rob*_*ert 9

您必须将模型的实例传递给视图:

 public ActionResult Register()
 {
      return View(new RegisterViewModel());
 }
Run Code Online (Sandbox Code Playgroud)

这是MVC中的正确做法。如果没有模型的实例,您将无法访问模型上的属性。

  • 这意味着 VS 2013 示例项目(当您执行 Project -&gt; New 时)不正确(这很可能是!),因为它没有传递模型实例。 (3认同)