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 に答える