2

我在使用 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 引用异常。

有任何想法吗?

4

3 回答 3

3

试试这个:

else 
{
    ModelState.AddModelError("Terms", "Please agree to the Terms");
    ModelState.SetModelValue("Terms", form.ToValueProvider()["Terms"]);
    ModelState.AddModelError("_FORM", "Terms not checked");
}

如果这不起作用,请发布异常的完整堆栈。

于 2009-03-11T13:38:08.760 回答
0

看起来短期答案只是将 html.ValidationMessage 重命名为其他名称

<%= Html.ValidationMessage("TermsError")%>

并确保控件在添加错误状态时使用相同的名称

ModelState.AddModelError("TermsError", "Please agree to the Terms");

这为我解决了这个问题。不过,我仍然想知道......使用 html.ValidationMessage 的最佳命名约定是什么?

于 2009-03-11T05:02:44.133 回答
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();
}

那应该工作得很好。

于 2009-03-11T06:40:48.407 回答