MVC3を使用しています。送信時に、ページを更新する PartialView を返すフォームがあります。質問/問題は、エラーが発生したときに ModelState エラーを表示し、フォームの値をそのまま維持するにはどうすればよいですか?
この質問は以前に尋ねられたようですが (以下の参考文献を参照)、完全な回答/解決策をまだ見つけていませんが、混乱しています...
- モデルの状態を維持するASP.Net MVC部分ビュー?
- http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/
- ビューを文字列としてレンダリングする
私の非常に単純なモデル
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);
}
ありがとう