9

VS2008 で MVC プロジェクト テンプレートを使用すると (そのまま使用できます)、次のことに気付きました。

  1. Register.aspx フォームを指定する方法を次に示します。

    <% using (Html.BeginForm()) { %>
    
  2. アカウント情報を提供せずに [登録] ボタンを選択すると、これが示されます。アカウントの作成に失敗しました。エラーを修正して、もう一度やり直してください。

    • ユーザー名を指定する必要があります。
    • 電子メール アドレスを指定する必要があります。
    • パスワードは 6 文字以上で指定する必要があります。

  3. Register.aspx フォームをこれに変更しました。

    <% using (Ajax.BeginForm("Register", new AjaxOptions { HttpMethod = "Post" })) { %>
    
  4. アカウント情報を指定せずに [登録] ボタンを選択しても、エラーは表示されません。

質問: Ajax.BeginForm の使用時にエラー テキストを表示するにはどうすればよいですか?

4

1 に答える 1

14

ajax フォーム送信を正常に適用するには、Register アクションとビューを変更する必要があります。デフォルトでは、エラーが発生した場合、このアクションは関連する register.aspx ビューを返すだけです。最初のステップは、部分的なユーザー コントロール内に検証の概要を配置することです。

ValidationSummary.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%= Html.ValidationSummary("Account creation was unsuccessful. Please correct the errors and try again.") %>

次に、この部分を Register.aspx ビュー内に含めます。

<div id="validationSummary">
    <% Html.RenderPartial("ValidationSummary"); %>
</div>

<% using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "validationSummary" })) { %>
    FORM CODE HERE
<% } %>

最後に、Register アクションを次のように変更します。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Register(string userName, string email, string password, string confirmPassword)
{
    // ... skipped content for clarity

    // If we got this far, something failed, redisplay form
    if (Request.IsAjaxRequest())
    {
        // If an ajax request was made return only the validation errors 
        // instead of the whole page
        return PartialView("ValidationSummary");
    }
    else
    {
        return View();
    }
}

登録がデフォルトで成功した場合、登録アクションはホーム/インデックスにリダイレクトするだけです。ajax リクエストを実行しているとリダイレクトが機能しないため、このビットも変更する必要があります。アクションを非同期で呼び出しているかどうかを同じ方法でテストし、登録が成功したことを示すテキストを返します。divこのテキストは、検証エラーと同じ内部に表示されます。


アップデート:

最後の質問 - エラー メッセージの箇条書きリストの代わりに、Html.ValidationMessage("....") メソッドを使用して各コントロールのエラー メッセージをコントロールの横に表示するにはどうすればよいですか?

これを実現するには、フォームのコンテンツを部分ビュー内に配置する必要があります。

<% using (Ajax.BeginForm(
    "register", 
    null, 
    new AjaxOptions { 
        HttpMethod = "POST", 
        UpdateTargetId = "myForm" 
    }, 
    new { 
        id = "myForm" 
    })) { %>
     <% Html.RenderPartial("RegisterForm"); %>
<% } %>

そして、登録アクションで正しいパーシャルをレンダリングします。

if (Request.IsAjaxRequest())
{
    return PartialView("RegisterForm");
}
else
{
    return View();
}
于 2009-10-18T16:20:38.180 に答える