私はASP.NET MVC 5フレームワークを使用してアプリケーションを作成しました。私はビューとViewModelsの間の双方向バインディングを使用しています。ModelStateDictionaryのデータをASP.NET MVCのプレゼンテーションモデルに手動でバインドする方法はありますか?
私は双方向バインディングを使用しているので、私はクールであるクライアントとサーバー側の検証の利点を得る。しかし、サーバーにPOST
リクエストを送信し、リクエストハンドラが例外をスローすると、そのユーザーをGET
メソッドにリダイレクトする必要があります。
リダイレクトが発生すると、モデルの状態を保存して、エラーを表示するときにページが同じように見えます。私はActionFilters
とTempData
via this approachを使って状態モデルとエラーを保存することができます。ただし、要求がリダイレクトされると、POST
からGET
にモデル状態は、POST
要求から来たすべてのユーザー入力を持つキー/値のペアであるSystem.Web.Mvc.ModelStateDictionary
オブジェクトとして保存されます。
ページをエンドユーザーに正しく表示するには、System.Web.Mvc.ModelStateDictionary
のデータを自分のプレゼンテーションモデルにバインドする必要があります。
System.Web.Mvc.ModelStateDictionary
オブジェクトをプレゼンテーションオブジェクトにバインドするにはどうすればよいですか?エラーがあればここで
は私のコードは
[ImportModelStateFromTempData]
public ActionResult show(int id)
{
var prsenter = new UserProfileDetailsPresenter(id);
ModelStateDictionary tmp = TempData["Support.ModelStateTempDataTransfer"];
if(tmp != null)
{
// Some how map tmp to prsenter
}
return View(prsenter);
}
[HttpPost]
[ValidateAntiForgeryToken]
[ExportModelStateToTempData]
public ActionResult Update(int id, DetailsPresenter model)
{
try
{
if (ModelState.IsValid)
{
var updater = new UpdateAddressServiceProvider(CurrentUser);
updater.Handle(model.General);
}
}
catch (Exception exception)
{
ModelState.AddModelError("error", exception.Message);
} finally
{
return new RedirectResult(Url.Action("Show", new { Id = id }) + "#General");
}
}
「表示」ビューでは、「DetailsPresenter」ではなく「UserProfileDetailsPresenter」オブジェクトが必要です。リクエストごとに 'UserProfileDetailsPresenter'を作成する代わりに、' Index'アクションにリダイレクトし、正しいオブジェクトを作成してデータをバインドさせるようにします。 – Jaylen
あなたは最善の賭けは両方の場所でその呼び出しを行うことです(既に方法でそれを持っているための名誉)。あなたはいつも、その 'UserProfileDetailsPresenter'を毎回作成しています。 MVCでこれを行う正しい方法です。間違ったデータ、不正なデータ、潜在的に危険なデータをデータベースに格納したくない場合。 – krillgar
その場合、ExportModelStateToTempDataは必要ありません。それを持つことのメリットは何ですか? – Jaylen