(MVC~在新增時,若系統發生錯誤,會保留在原頁面)
這照理應是很簡單的處理邏輯,但在MVC上,我一直試不出最好的動線~
查到的資訊,都是把它導到 別頁 去做呈現。
因此~~~這問題放了好一陣子(都忘了這事了...)
直到今天,碰到這問題「有心」想解看看~~~~
===============================
這最根本的問題是:在導回原頁時,它的Model會是Null,而造成它會出現這類問題:
「Object reference not set to an instance of an object for viewResult.View.Render」
而這篇,就解決最根本的問題:
Any way to recover model passed to POST action when inside OnException(ExceptionContext filterContext)?
1).
它在 DefaultModelBinder 的 OnModelUpdated 事件裡,把Model 資料存起來,(存TempData)
而在 發生 Exception 時,再把值拿出來
var datamodel = filterContext.Controller.TempData["model"]
2).
怎麼把 datamodel 放進 ViewResult 物件裡??
>>因 ViewResult.Model 是 only Get 的,不能設定值,
要用 ViewResult.ViewData.Model 去設定值:
this.DefaultView = new ViewResult { ViewName = defaultViewName, TempData = filterContext.Controller.TempData, ViewData = filterContext.Controller.ViewData }; MyPageStatus = MyPageStatus; //把Status重存一次 var datamodel = filterContext.Controller.TempData["model"]; DefaultView.ViewData.Model = datamodel; filterContext.Result = DefaultView;
====================================
另一個「先前」處理的重點:
因我用單一個View 來處理「Display/Create/Update」的呈現結果,
而因在MVC下其 action 就是它的Url ,所以,若使用預設導回原頁,會找不到「Create/Update」頁面。
因此,定義了 defaultViewName 來處理。
protected override void OnResultExecuted(ResultExecutedContext filterContext) { if (filterContext.Result != null && (filterContext.Result is System.Web.Mvc.ViewResult)) { defaultViewName = (filterContext.Result as ViewResult).ViewName; } base.OnResultExecuted(filterContext); }
0 意見 :
張貼留言