2014/08/28

20140828-程式-MVC在發生Exception時有辦法再導回原頁呈現



(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 意見 :

張貼留言