我有一个非常简单的页面(我已经把它减少到几乎没什么可看的,如果我可以使这个工作)。使用下面显示的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。可能这是设计?
答案 0 :(得分:3)
您必须将模型的实例传递给视图:
public ActionResult Register()
{
return View(new RegisterViewModel());
}
这是MVC中的正确做法。如果没有模型实例,则无法访问模型上的属性。
答案 1 :(得分:1)
如果您的视图正在渲染并绑定到模型,那么您需要将模型传递给视图。如果它是视图的初始GET,您应该传递一个空模型。