當我們在使用ASP.NET MVC實現頁面跳轉的時候,常用的應該是:
Redirect
RedirectToAction
RedirectToRoute
或者在前台使用腳本跳轉。
但這幾種跳轉方式都是基於Get請求的,在某些特定場景下可能並不適用。例如需要傳遞大數據量參數、或者復雜對象類型參數的場景,get方式肯定是有限制的。
在webform裡面,有一種服務器端跳轉方式:Server.Transfer,相信大家一定都還記得。這種方式是中止當前頁面執行,並將執行流程轉入一個新的頁面,並使用上一個頁面創建的應答流。 這種方式具有如下的特點:
1,地址欄URL不會發生變化。
2,上一個頁面後台產生的參數和對象可以直接傳遞到新的頁面。
3,減少客戶端對服務器的請求。
我們知道,ASP.NET MVC有一個核心思想,就是“約定勝於配置” ,例如在執行完一個action後,會到view目錄下根據controller名稱查找對應的view來進行渲染,但是 約定的做法並不意味著不能改變。
對於ASP.NET MVC而言,可以通過動態改變當前Action所渲染的view路徑,來實現類似的效果。
渲染非常規路徑的View
第一步,先實現一個自定義的ViewEngine:
public class ChangeViewEngine : System.Web.Mvc.RazorViewEngine { public ChangeViewEngine(string controllerPathName,string viewName) { this.ViewLocationFormats = new[] {"~/Views/" + controllerPathName + "/" + viewName + ".cshtml" }; } }
第二步,實現一個ActionAttribute
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)] public class ChangeViewPathAttribute : ActionFilterAttribute { private string _controllerPath; private string _viewName; public ChangeViewPathAttribute(string controllerPath,string viewName) { this._controllerPath = controllerPath; this._viewName = viewName; } public override void OnResultExecuting(ResultExecutingContext filterContext) { //base.OnResultExecuting(filterContext); //ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new ChangeViewEngine(_controllerPath,_viewName)); } }
在該段代碼裡面,ChangeViewPathAttribute類繼承於ActionFilter,並重寫其中的OnResultExecuting方法,將自定義的ViewEngine加入到全局ViewEngine集合裡面來。
第三步,在需要渲染不同路徑的action加上Attribute
[HttpPost] [Filter.ChangeViewPath("Invoice","Create")] public ActionResult PreInvoice(string strIds,bool flag)
在做完以上步驟後,我們就可以隨意指定action所要渲染的view,在服務器端進行跳轉,實現類似Server.Transfer的效果。 當然,以上只是一個簡單的示例,你完全可以做的更優雅一點,實現更靈活的路徑配置。
以上就是本文的全部內容,希望對大家的學習有所幫助。