我遇到MVC RC2问题,在验证失败时,当视图传回给用户时,失败的字段会抛出NullReferenceException。
找到了一个短期解决方案:将Html.ValidationMessage重命名为与目标表单字段不同。这有效!
但是现在自动突出显示与输入字段断开连接。 (开箱即用的行为是改变目标字段的CSS类,使其更加突出)
所以......
我的代码存在什么问题? 和 为什么不允许我的ValidationMessage和Form字段共享相同的名称?
运行以下代码时,代码抛出NullReferenceException:
查看代码
<% using (Html.BeginForm()) { %>
<fieldset>
<h5>Terms and Conditions</h5>
<p>
<%= Html.CheckBox("Terms", false)%>
<%= Html.ValidationMessage("Terms")%>
I agree to the <a href="/signup/terms">Terms & Conditions.</a>
</p>
</fieldset>
<input class="signup_button" type="submit" title="Sign Up" value="" />
<% } %>
<%= Html.ValidationSummary("Sign up wasn't successful.")%>
控制器代码
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection form)
{
bool Terms = form["Terms"].ToString() == "true,false" ? true : false;
if (Terms)
{
return RedirectToAction("Success", "Signup");
}
else
{
ModelState.AddModelError("Terms", "Please agree to the Terms");
ModelState.AddModelError("_FORM", "Terms not checked");
}
return View();
}
如果我省略以下内容,我可以使用该代码:
ModelState.AddModelError("Terms", "Please agree to the Terms");
但是这样,复选框会抛出Null引用异常。
任何想法?
答案 0 :(得分:3)
试试这个:
else
{
ModelState.AddModelError("Terms", "Please agree to the Terms");
ModelState.SetModelValue("Terms", form.ToValueProvider()["Terms"]);
ModelState.AddModelError("_FORM", "Terms not checked");
}
如果这不起作用,请发布完整堆栈以查找异常。
答案 1 :(得分:0)
看起来短期答案只是将html.ValidationMessage重命名为其他内容
<%= Html.ValidationMessage("TermsError")%>
确保控件在添加错误状态时使用相同的名称
ModelState.AddModelError("TermsError", "Please agree to the Terms");
这解决了我的问题。不过,我想知道......使用html.ValidationMessage的最佳命名约定是什么?
答案 2 :(得分:0)
在这种情况下,你为什么要传递表单集合?为什么不这样做?
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(bool terms)
{
if (terms)
{
return RedirectToAction("Success", "Signup");
}
else
{
ModelState.AddModelError("Terms", "Please agree to the Terms");
ModelState.AddModelError("_FORM", "Terms not checked");
}
return View();
}
应该工作得很好。