ASP.NET MVC 3仿Server.Transfer效果的實(shí)現(xiàn)方法
當(dāng)我們?cè)谑褂肁SP.NET MVC實(shí)現(xiàn)頁面跳轉(zhuǎn)的時(shí)候,常用的應(yīng)該是:
Redirect
RedirectToAction
RedirectToRoute
或者在前臺(tái)使用腳本跳轉(zhuǎn)。
但這幾種跳轉(zhuǎn)方式都是基于Get請(qǐng)求的,在某些特定場景下可能并不適用。例如需要傳遞大數(shù)據(jù)量參數(shù)、或者復(fù)雜對(duì)象類型參數(shù)的場景,get方式肯定是有限制的。
在webform里面,有一種服務(wù)器端跳轉(zhuǎn)方式:Server.Transfer,相信大家一定都還記得。這種方式是中止當(dāng)前頁面執(zhí)行,并將執(zhí)行流程轉(zhuǎn)入一個(gè)新的頁面,并使用上一個(gè)頁面創(chuàng)建的應(yīng)答流。 這種方式具有如下的特點(diǎn):
1,地址欄URL不會(huì)發(fā)生變化。
2,上一個(gè)頁面后臺(tái)產(chǎn)生的參數(shù)和對(duì)象可以直接傳遞到新的頁面。
3,減少客戶端對(duì)服務(wù)器的請(qǐng)求。
我們知道,ASP.NET MVC有一個(gè)核心思想,就是“約定勝于配置” ,例如在執(zhí)行完一個(gè)action后,會(huì)到view目錄下根據(jù)controller名稱查找對(duì)應(yīng)的view來進(jìn)行渲染,但是 約定的做法并不意味著不能改變。
對(duì)于ASP.NET MVC而言,可以通過動(dòng)態(tài)改變當(dāng)前Action所渲染的view路徑,來實(shí)現(xiàn)類似的效果。
渲染非常規(guī)路徑的View
第一步,先實(shí)現(xiàn)一個(gè)自定義的ViewEngine:
public class ChangeViewEngine : System.Web.Mvc.RazorViewEngine
{
public ChangeViewEngine(string controllerPathName,string viewName)
{
this.ViewLocationFormats = new[] {"~/Views/" + controllerPathName + "/" + viewName + ".cshtml" };
}
}
第二步,實(shí)現(xiàn)一個(gè)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,在服務(wù)器端進(jìn)行跳轉(zhuǎn),實(shí)現(xiàn)類似Server.Transfer的效果。 當(dāng)然,以上只是一個(gè)簡單的示例,你完全可以做的更優(yōu)雅一點(diǎn),實(shí)現(xiàn)更靈活的路徑配置。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
mysql安裝后.net程序運(yùn)行出錯(cuò)的解決方法
這篇文章主要給大家介紹了關(guān)于mysql安裝后.net程序運(yùn)行出錯(cuò)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02
jQuery+Asp.Net實(shí)現(xiàn)省市二級(jí)聯(lián)動(dòng)功能的方法
這篇文章主要介紹了jQuery+Asp.Net實(shí)現(xiàn)省市二級(jí)聯(lián)動(dòng)功能的方法,涉及asp.net數(shù)據(jù)庫讀取與字符串轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
.Net Core庫類項(xiàng)目跨項(xiàng)目讀取配置文件的方法
這篇文章主要介紹了.Net Core庫類項(xiàng)目跨項(xiàng)目讀取配置文件的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
asp.net 數(shù)據(jù)庫的連接和datatable類
asp.net下數(shù)據(jù)庫的連接與數(shù)據(jù)庫datatable類實(shí)現(xiàn)代碼。2009-05-05
ASP.NET.4.5.1+MVC5.0設(shè)置系統(tǒng)角色與權(quán)限(一)
這篇文章主要介紹了ASP.NET.4.5.1+MVC5.0設(shè)置系統(tǒng)角色與權(quán)限的部分內(nèi)容,后續(xù)我們將繼續(xù)討論這個(gè)話題,希望小伙伴們喜歡。2015-01-01
在?.NET?平臺(tái)使用?ReflectionDynamicObject?優(yōu)化反射調(diào)用的代碼詳解
這篇文章主要介紹了在?.NET?平臺(tái)使用?ReflectionDynamicObject?優(yōu)化反射調(diào)用代碼,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
RadioButtonList綁定圖片及泛型Dictionary應(yīng)用
讀取站點(diǎn)某一目錄的圖片,需要掌握LINQ與泛型Dictionary<TKey,TValue>的使用,本文將介紹RadioButtonList綁定圖片的實(shí)現(xiàn),感興趣的朋友可以了解下,或許對(duì)你有所幫助2013-02-02
.NET 6開發(fā)之實(shí)現(xiàn)緩存過程詳解
有的時(shí)候?yàn)榱藴p少客戶端請(qǐng)求相同資源的邏輯重復(fù)執(zhí)行,我們會(huì)考慮使用一些緩存的方式。這篇文章主要就介紹了在.NET 6開發(fā)中如何實(shí)現(xiàn)緩存,感興趣的可以學(xué)習(xí)一下2022-01-01

