2016-12-08 3 views
5

私はASP.NET MVC 5フレームワークを使用してアプリケーションを作成しました。私はビューとViewModelsの間の双方向バインディングを使用しています。ModelStateDictionaryのデータをASP.NET MVCのプレゼンテーションモデルに手動でバインドする方法はありますか?

私は双方向バインディングを使用しているので、私はクールであるクライアントとサーバー側の検証の利点を得る。しかし、サーバーにPOSTリクエストを送信し、リクエストハンドラが例外をスローすると、そのユーザーをGETメソッドにリダイレクトする必要があります。

リダイレクトが発生すると、モデルの状態を保存して、エラーを表示するときにページが同じように見えます。私はActionFiltersTempDatavia 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"); 
    } 
} 

答えて

4

どのように見えるかで、ちょうどビューを返し、リダイレクトされません。

[HttpPost] 
[ValidateAntiForgeryToken] 
[ExportModelStateToTempData] 
public ActionResult Update(int id, DetailsPresenter model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var updater = new UpdateAddressServiceProvider(CurrentUser); 

      updater.Handle(model.General); 
     } 

     return new RedirectResult(Url.Action("Show", new { Id = id }) + "#General"); 
    } 
    catch (Exception exception) 
    { 
     ModelState.AddModelError("error", exception.Message); 

     // Return the named view directly, and pass in the model as it stands. 
     return View("Show", model); 
    } 
} 
+0

「表示」ビューでは、「DetailsPresenter」ではなく「UserProfileDetailsPresenter」オブジェクトが必要です。リクエストごとに 'UserProfileDetailsPresenter'を作成する代わりに、' Index'アクションにリダイレクトし、正しいオブジェクトを作成してデータをバインドさせるようにします。 – Jaylen

+0

あなたは最善の賭けは両方の場所でその呼び出しを行うことです(既に方法でそれを持っているための名誉)。あなたはいつも、その 'UserProfileDetailsPresenter'を毎回作成しています。 MVCでこれを行う正しい方法です。間違ったデータ、不正なデータ、潜在的に危険なデータをデータベースに格納したくない場合。 – krillgar

+0

その場合、ExportModelStateToTempDataは必要ありません。それを持つことのメリットは何ですか? – Jaylen

関連する問題