ASP.Net MVC RC2 ValidationMessage和表单字段冲突?

时间:2009-03-11 04:45:50

标签: asp.net-mvc input nullreferenceexception

我遇到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引用异常。

任何想法?

3 个答案:

答案 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();
}

应该工作得很好。