7

状況は次のとおりです。

viewModelPOST アクション メソッドに渡された を取得する方法が見つかりません。

[HttpPost]
public ActionResult Edit(SomeCoolModel viewModel)
{
    // Some Exception happens here during the action execution...
}

コントローラーのオーバーライド可能な内部OnException:

protected override void OnException(ExceptionContext filterContext)
{
    ...

    filterContext.Result = new ViewResult
    {
        ViewName = filterContext.RouteData.Values["action"].ToString(),
        TempData = filterContext.Controller.TempData,
        ViewData = filterContext.Controller.ViewData
    };
}

コードをデバッグするときfilterContext.Controller.ViewDatanull、コードの実行中に例外が発生し、ビューが返されなかったためです。

とにかく、それfilterContext.Controller.ViewData.ModelStateが満たされ、必要なすべての値があることがわかりますが、完全なViewData => viewModelオブジェクトが利用可能ではありません。:(

Viewポストバックと同じものをdata/ViewModel中心点でユーザーに返却したい。あなたが私のドリフトを理解してくれることを願っています。

目的を達成するためにたどることができる他の道はありますか?

4

1 に答える 1

8

DefaultModelBinderから継承するカスタム モデル バインダーを作成し、モデルを に割り当てることができTempDataます。

public class MyCustomerBinder : DefaultModelBinder
{
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        base.OnModelUpdated(controllerContext, bindingContext);

        controllerContext.Controller.TempData["model"] = bindingContext.Model;
    }
}

そしてそれをに登録しGlobal.asaxます:

ModelBinders.Binders.DefaultBinder = new MyCustomerBinder();

次にアクセスします。

protected override void OnException(ExceptionContext filterContext)
{
    var model = filterContext.Controller.TempData["model"];

    ...
}
于 2014-08-09T07:17:35.857 に答える