使用Razor语法的Html.TextBoxFor NullReferenceException

时间:2014-03-31 15:15:40

标签: c# asp.net asp.net-mvc razor

我有一个非常简单的页面(我已经把它减少到几乎没什么可看的,如果我可以使这个工作)。使用下面显示的lambda调用Html.TextBoxFor时抛出NullReferenceException。我想弄清楚为什么会这样?

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

如果我为TextBoxFor交换PasswordFor,则也不会抛出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>

视图模型

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; }
}

例外:

System.NullReferenceException
   at lambda_method(Closure , RegisterViewModel )

想法?这是设计的吗?它在内部抛出和捕获NullReferenceException?

修改

控制器本身是空的。

[Authorize]
public class AccountController : Controller
{
   [AllowAnonymous]
    public ActionResult Register()
    {
        return View();
    }
}

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

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

2 个答案:

答案 0 :(得分:3)

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

 public ActionResult Register()
 {
      return View(new RegisterViewModel());
 }

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

答案 1 :(得分:1)

如果您的视图正在渲染并绑定到模型,那么您需要将模型传递给视图。如果它是视图的初始GET,您应该传递一个空模型。