2

MVC3を使用しています。送信時に、ページを更新する PartialView を返すフォームがあります。質問/問題は、エラーが発生したときに ModelState エラーを表示し、フォームの値をそのまま維持するにはどうすればよいですか?

この質問は以前に尋ねられたようですが (以下の参考文献を参照)、完全な回答/解決策をまだ見つけていませんが、混乱しています...

私の非常に単純なモデル

public class TEST_AjaxFormViewModel
{
    [Required]
    [StringLength(10)]
    public string Name { get; set; }
}

私のビューは次のようになります。

        <% using (Ajax.BeginForm("TEST_AjaxForm", new AjaxOptions { UpdateTargetId = "formResults" }))
           {%>

            <%:Html.ValidationSummary(true, "Please correct errors:")%>

            <div class="editor-label">
                <%:Html.LabelFor(model => model.Name)%>
            </div>
            <div class="editor-field">
                <%:Html.TextBoxFor(model => model.Name)%>
                <%:Html.ValidationMessageFor(model => model.Name)%>
            </div>
            <br />

            <div class="editor-label"></div>
            <div class="editor-field">
                <button name="button" type="submit" value="Submit">
                    Submit
                </button>
            </div>
            <br />

        <% }%>

        <div id="formResults" style="border: 1px dotted red; margin: 2.0em; padding: 1.0em;">
            <p>This is where my partial view will go</p>
        </div>

そして、私の PartialView は出力を吐き出すだけです:

            <div class="editor-label"></div>
            <div class="editor-field">
                <%: Model.Name %>
            </div>
            <br />

そして、私のController Actionメソッドはこのように

    [HttpPost]
    public ActionResult TEST_AjaxForm(TEST_AjaxFormViewModel model)
    {
        if (ModelState.IsValid)
        {   
            return PartialView("TEST_AjaxFormPartialView", model);
        }
        //else
        return View(model);  // this is wrong! what should I return instead?
    }

問題は、ModelState エラーでビューを返す方法です。

私が提供したリンクでは、クライアント側がエラー対成功条件 (つまり、RenderPartialViewToString) を検出できるように、ステータス コードを含む json を返すことについての話があります。しかし、これがどのように接続/消費されるのか、私にはよくわかりません。

例: 成功した場合、部分ビューのみを表示しますか? エラーの場合、更新された ModelState でページを更新するだけですか? 誰かがピースをリンクして、エンドツーエンドの例、つまり View/jquery ajax 呼び出しを示すことができますか?

余談:代替の実装として、このアプローチに似たものを使用して動作させましたが、わかりません...それは間違っているようで、成功した場合よりも多くのページを更新しているためですシナリオ。

http://jvance.com/blog/2010/02/20/MakingAnAjaxFormWithJQueryInASPdotNETMVC.xhtml

たとえば、コントローラーは次のようになります。PartialViews には、成功バージョンとエラー バージョンの両方で「フォーム」コードが含まれています。

    [HttpPost]
    public ActionResult TEST_AjaxFormSingleMasterDiv(TEST_AjaxFormViewModel model)
    {
        if (ModelState.IsValid)
        {   // no model state errors
            return PartialView("TEST_AjaxFormSingleMasterDivPartialView_Success", model);
        }
        // else, error
        return PartialView("TEST_AjaxFormSingleMasterDivPartialView_Error", model);
    }

ありがとう

4

2 に答える 2

0

私もこの問題を抱えており、ここでの解決策は仕事をしました。その非常に簡単: トリックは、AjaxOptions の UpdateTargetId 内にフォーム自体を含めることです 。 /

于 2011-07-05T22:02:27.963 に答える
0

あなたはとても近くにいます。コントローラーは次のようになります。

[HttpPost]
public ActionResult TEST_AjaxForm(TEST_AjaxFormViewModel model)
{
    if (ModelState.IsValid)
    {
        // perhaps do some additional actions? Save data to DB?
        return PartialView("TEST_AjaxFormPartialView", model);
    }
    //else
    return PartialView("TEST_AjaxFormPartialView", model);
}

ご覧のとおり、 yourModelStateが有効かどうかに関係なく、同じモデルで同じビューを返します。唯一の違いは、それが有効な場合、いくつかの追加のアクションを実行したい場合があることです。

エラーを表示するには、エラーが表示されるビューにピースを追加する必要があります。ただし、Html.ValidationSummaryまたはHtml.ValidationMessageまたはHtml.ValidationMessageForレンダリングするには、フォーム内にある必要があります。これがあなたのビューです:

@model [namespace].TEST_AjaxFormViewModel

<%: Html.BeginForm() %>
<div><%: Html.ValidationSummary() %></div>
<div class="editor-label"></div>
<div class="editor-field">
    <%: Model.Name %>
</div>
<%: Html.EndForm() %>
<br />
于 2012-06-13T20:00:48.293 に答える