Любой способ восстановить модель, переданную действию POST, когда внутри OnException(ExceptionContext filterContext)?

Ситуация такая:

Я не могу найти способ получить viewModel это было передано методу действия POST.

[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.ViewData является null поскольку исключение произошло во время выполнения кода, и не было возвращено никакого представления.

В любом случае я вижу, что filterContext.Controller.ViewData.ModelState заполнен и имеет все значения, которые мне нужны, но у меня нет полного ViewData => viewModel объект доступен.:(

Я хочу вернуть то же самое View с опубликованным data/ViewModel вернуться к пользователю в центральной точке. Надеюсь, вы поняли меня.

Есть ли какой-то другой путь, которым я могу следовать для достижения цели?

1 ответ

Решение

Вы можете создать пользовательский механизм связывания модели, который наследуется от 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"];

    ...
}
Другие вопросы по тегам