Asp.Net MVC 3【URLs, Routing,and Areas】续
http://www.cnblogs.com/HuiTai/archive/2012/07/24/2597875.html
接著前面繼續(xù)學(xué)習(xí)分享我們的路由。
現(xiàn)在我們把Global.asax文件里的RegisterRoutes方法還原至原來的樣式,具體代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; using Routing.Infrastructure;namespace Routing {// 注意: 有關(guān)啟用 IIS6 或 IIS7 經(jīng)典模式的說明,// 請?jiān)L問 http://go.microsoft.com/?LinkId=9394801public class MvcApplication : System.Web.HttpApplication{public static void RegisterGlobalFilters(GlobalFilterCollection filters){filters.Add(new HandleErrorAttribute());}public static void RegisterRoutes(RouteCollection routes){//整理RegisterRoutesroutes.MapRoute("MyRoute", "{controller}/{action}/id",new { controller = "Home", action = "Index", id = UrlParameter.Optional });}protected void Application_Start(){AreaRegistration.RegisterAllAreas();RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);}} }生成的URL在視圖
生成傳出URL最簡單的方法是在視圖里調(diào)用內(nèi)的Html.ActionLink方法。具體代碼如下:
@Html.ActionLink("About this application", "About")ActionLink的方法的參數(shù)為文本鏈接和操作方法的名稱,應(yīng)針對鏈接。ActionLink的方法生成的HTML的基礎(chǔ)上,在當(dāng)前的路由架構(gòu)。上面運(yùn)行后的HTML代碼表示如下:
<a href="/Home/About">About this application</a>但假設(shè)我們改變路由模式通過添加一個(gè)新的路由,像下面:
public static void RegisterRoutes(RouteCollection routes){routes.MapRoute("NewRoute", "App/Do{Action}", new { controller = "Home" });//整理RegisterRoutesroutes.MapRoute("MyRoute", "{controller}/{action}/id",new { controller = "Home", action = "Index", id = UrlParameter.Optional });}然后我們得到了下面的HTML從ActionLinkhelper方法當(dāng)我們呈現(xiàn)頁面:
<a href="/App/DoAbout">About this application</a>在這種方式生成的鏈接如何解決維修問題。我們能夠改變我們的路由模式,即將生成自動(dòng)映射這一變化。
指向其他控制器(Controller)
默認(rèn)的版本的ActionLink方法,假定您想要一個(gè)動(dòng)作方法為目標(biāo)在同一個(gè)控制器已經(jīng)造成視圖呈現(xiàn)出來。創(chuàng)建一個(gè)新生成的URL,目標(biāo)是不同的控制器您可以使用一個(gè)不同的重載,它允許您指定控制器的名字,具體代碼如下:
@Html.ActionLink("About this application", "About", "MyController")當(dāng)你運(yùn)行器項(xiàng)目,你會(huì)看到他的連接會(huì)是這樣的,具體代碼如下:
<a href="/MyController/About">About this application</a>傳遞額外的值
我們可以通過段使用匿名類型的變量的值,用屬性代表段,具體如下:
@Html.ActionLink("About this application", "About", new { id = "MyID" })我們已經(jīng)提供了一個(gè)值為一段變量稱為id。當(dāng)我跑起項(xiàng)目,我們可以看到這樣的連接,具體如下:
<a href="/Home/About/MyID">About this application</a>我們提供的參數(shù)值已經(jīng)添加作為URL的細(xì)分部分,以匹配的URL模式到我們的應(yīng)用程序的路徑。
當(dāng)我們提供的不符合部分變量的屬性值,值作為查詢字符串附加到傳出的URL,具體代碼如下:
@Html.ActionLink("About this application", "About", new { id = "MyID", myVariable = "MyValue"})他生成的HTML代碼如下:
<a href="/Home/About/MyID?myVariable=MyValue">About this application</a>如果我們提供一個(gè)變量值,正好符合我們在路由指定的默認(rèn)值,然后路由系統(tǒng)省略了即將生成輸出的URL變量,具體代碼如下:
@Html.ActionLink("About this application", "Index", "Home")我們作為參數(shù)傳遞的值的操作方法和控制器的匹配默認(rèn),運(yùn)行后生成頁面的HTML代碼如下:
<a href="/">About this application</a>指定的HTML屬性
生成一個(gè)完整的HTML錨(<A>)的元素。我們可以通過提供一個(gè)設(shè)置該元素的屬性匿名類型的屬性對應(yīng)到我們所需要的屬性。下面一個(gè)示范設(shè)置一個(gè)id屬性和分配的HTML元素的CSS類。
(生成一個(gè)錨元素和屬性).具體代碼如下:
@Html.ActionLink("About this application", "Index", "Home", null, new {id = "myAnchorID", @class = "myCSSClass"})我們已經(jīng)創(chuàng)建了一個(gè)新的匿名類型的id和class屬性,并通過它作為一個(gè)ActionLink的方法參數(shù)。我們通過額外的變量值部分為null,表明我們沒有提供任何值,運(yùn)行后的HTML代碼如下:
<a class="myCSSClass"href="/" id="myAnchorID">About this application</a>生成一個(gè)完全合格的URL
到目前為止,我們已經(jīng)產(chǎn)生含有相對URL,但我們也可以使用ActionLinkhelper方法來生成一個(gè)合格的URL,具體代碼如下:
@Html.ActionLink("About this application", "Index", "Home", "https", "myserver.mydomain.com", " myFragmentName", new { id = "MyId"}, new { id = "myAnchorID", @class = "myCSSClass"})這是ActionLink的載入大多數(shù)參數(shù),它提供的值,目標(biāo)服務(wù)器的名稱(myserver.mydomain.com)和URL片段(myFragmentName),以及你以前看到的所有其他選項(xiàng)。當(dāng)呈顯在視圖,運(yùn)行之后的HTML如下:
<a class="myCSSClass" href="https://myserver.mydomain.com/Home/Index/MyId#myFragmentName" id="myAnchorID">About this application</a>我們建議盡可能使用相對URL。完全合格的URL創(chuàng)建依賴關(guān)系的方式呈現(xiàn)給用戶,您的應(yīng)用程序基礎(chǔ)設(shè)施。我們已經(jīng)看到了許多大應(yīng)用程序依賴不協(xié)調(diào)的變化打破了網(wǎng)絡(luò)的絕對URL基礎(chǔ)設(shè)施或域名政策,這也是我們無法管控的。
生成URL(非連接)
Html.ActionLink輔助方法生成完整的HTML<a>元素,這是正是我們想要的。然而,有的時(shí)候,我們只需要一個(gè)URL,這可能是因?yàn)槲覀円@示的URL,建立一個(gè)鏈接的HTML手動(dòng)顯示的URL值,或包含作為一個(gè)數(shù)據(jù)元素所呈現(xiàn)的HTML頁面的網(wǎng)址。
在這種情況下,我們可以使用生成的URL,而不是Url.Action方法周圍的HTML,具體代碼如下:
... My URL is: @Url.Action("Index", "Home", new { id = "MyId" }) ...Url.Action方法的Html.ActionLink方法相同的方式工作,但它生成唯一的URL。運(yùn)行后的HTML代碼如下:
My URL is: /Home/Index/MyId路由數(shù)據(jù)生成的鏈接和URL
前面提到,路由系統(tǒng)不指定任何特殊的意義控制器行動(dòng)部分的變量,當(dāng)它被處理的URL。附加到MVC框架,允許路由系統(tǒng)可以更廣泛地與其他類型的ASP.NET應(yīng)用程序使用。有時(shí)它是用于對待控制器和行動(dòng),就像任何其他變量。并產(chǎn)生鏈接或URL提供一個(gè) Name/Value 對的集合。我們可以通過使用輔助方法不是具體的mvc特性。
下面看 生成一個(gè)鏈接使用匿名類型,具體代碼如下:
@Html.RouteLink("Routed Link", new { controller = "Home", action = "About", id="MyID"})有沒有參數(shù),為RouteLink方法來表達(dá)控制器和行動(dòng)值。我們必須包括他們作為匿名類型的屬性。運(yùn)行后的HTML代碼如下:
<a href="/Home/About/MyID">Routed Link</a>我們也可以使用?Url.RouteUrl輔助方法來生成網(wǎng)址,具體代碼如下:
@Url.RouteUrl(new { controller = "Home", action = "About", id = "MyID" })這些方法都很少需要,因?yàn)槲覀円话愣贾?#xff0c;要指定控制器和行動(dòng)明確的值。但它是很好的了解,這些方法都存在,當(dāng)你需要他們輕松很多,但是很少可能。
在操作(Action)方法生成傳出URL
大多數(shù)情況下,我們需要生成傳出網(wǎng)址,但有時(shí),當(dāng)我們想做些什么類似的內(nèi)部操作方法。如果我們只需要生成一個(gè)URL,我們可以使用相同的輔助方法我們在視圖中使用,具體代碼如下:
public ViewResult MyActionMethod() { string myActionUrl = Url.Action("Index", new { id = "MyID" }); string myRouteUrl = Url.RouteUrl(new { controller = "Home", action = "Index" }); ... }一個(gè)更常見的需求是重定向客戶端瀏覽器到另一個(gè)URL。我們可以通過調(diào)用RedirectToAction方法,例如下面代碼:
public ActionResult MyActionMethod() { return this.RedirectToAction("Index"); }RedirectToAction方法的結(jié)果是RedirectToRouteResult,指示的MVC框架發(fā)出重定向的URL將調(diào)用指定的動(dòng)作指令。還有一些通常RedirectToAction方法的重載版本,指定控制器和值在生成的URL段的變量。如果你想發(fā)送重定向使用從對象的屬性生成一個(gè)URL,你可以使用RedirectToRoute方法,(重定向到一個(gè)URL生成一個(gè)匿名類型的屬性),具體代碼如下:
public ActionResult MyOtherActionMethod() { return RedirectToRoute(new { controller = "Home", action = "Index", id = "MyID" }); }這種方法也返回一個(gè)RedirectToRouteResult對象,并調(diào)用具有完全相同的效果RedirectToAction方法.
從一個(gè)特定的路由生成一個(gè)URL
例如,我們定義下面的路由:
我們作為第一個(gè)參數(shù)傳遞的路由,我們創(chuàng)建指定名稱的MapRoute方法這種情況下,MyRoute和MyOtherRoute。
命名你的路由有兩個(gè)原因:
- 作為一種提醒路由的目的
- 你可以選擇一個(gè)特定的路由被用來生成一個(gè)傳出的URL
我們已安排的路由,使最不特定的列表中首先出現(xiàn)。這意味著,如果我們要生成一個(gè)鏈接使用這樣的ActionLink的方法,具體代碼如下:
@Html.ActionLink("Click me", "About");你可以通過默認(rèn)路由匹配的行為使用Html.RouteLink方法,這讓你指定你要使用哪條路線,具體代碼如下:
@Html.RouteLink("Click me", "MyOtherRoute", new { action = "About" });★定制路由體制★
我們已經(jīng)看到如何靈活和可配置的路由系統(tǒng),但如果它不符合我們的的要求,那么我們可以自定義的行為。
創(chuàng)建自定義RouteBase實(shí)現(xiàn)
如果你不喜歡標(biāo)準(zhǔn)Route對象匹配的URL的方式,或想實(shí)現(xiàn)的東西不尋常的,可以替代類從RouteBase派生。這使你可以匹配URL,參數(shù)提取,并傳出的URL是如何傳出的。
從RouteBase得出一個(gè)類,您需要實(shí)現(xiàn)兩個(gè)方法:
- GetRouteData(HttpContextBase httpContext):這是該機(jī)制匹配入站URL。框架調(diào)用此方法對每個(gè)反過來RouteTable.Routesentry,直到其中一個(gè)返回一個(gè)非的NullValue。
- GetVirtualPath(RequestContext requestContext, RouteValueDictionary values):這是路由工作匹配出站URL生成的機(jī)制。 框架調(diào)用方法上每個(gè)反過來RouteTable.Routesentry,直到之一他們返回一個(gè)非的NullValue。
為了證明這種定制,我們要?jiǎng)?chuàng)建一個(gè)RouteBase類將處理傳統(tǒng)的URL請求。試想一下,我們現(xiàn)有的應(yīng)用程序遷移到MVC框架,但有些MVC URL或硬編碼成劇本。我們?nèi)匀幌MС诌@些舊的網(wǎng)址。我們可以處理這種使用常規(guī)的路由機(jī)制。開始,我們需要?jiǎng)?chuàng)建一個(gè)控制器,我們將在收到我們的傳統(tǒng)要求。我們需要通知給我們控制器LegacyController(這里從新創(chuàng)建一個(gè)項(xiàng)目"Routing_Project"),具體代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;namespace Routing_Project.Controllers {public class LegacyController : Controller{public ActionResult GetLegacyURL(string legacyURL) {return this.View((object)legacyURL);}} }在這個(gè)簡單的控制器的GetLegacyURL操作方法需要的參數(shù),并通過它作為一個(gè)查看視圖的模型。如果我們真的實(shí)現(xiàn)此控制器,我們將使用此方法檢索請求的文件,因?yàn)槲覀冎皇且谝粋€(gè)視圖中顯示的URL。對應(yīng)的視圖GetLegacyURL.cshtml代碼如下:
@model string @{ViewBag.Title = "GetLegacyURL";this.Layout = null; }<h2>GetLegacyURL</h2>The URL Requested Was:@Model這是很簡單的。我們只要證明自定義的路由行為,所以我們不要花費(fèi)任何時(shí)間創(chuàng)建復(fù)雜的行動(dòng)和視圖。現(xiàn)在,我們已經(jīng)達(dá)到目的,我們可以創(chuàng)建派生RouteBase。
路由傳入的URL
我們已創(chuàng)建LegacyRoute類,這是我們放在頂層文件夾("Infrastructure").具體代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace Routing_Project.Infrastructure {public class LegacyRoute : RouteBase{private string[] urls;//構(gòu)造函數(shù)public LegacyRoute(params string[] targetUrls){this.urls = targetUrls;}public override RouteData GetRouteData(HttpContextBase httpContext){RouteData result = null;//獲取應(yīng)用程序的虛擬目錄string requestedURL = httpContext.Request.AppRelativeCurrentExecutionFilePath;if (this.urls.Contains(requestedURL,StringComparer.OrdinalIgnoreCase)){result = new RouteData(this, new MvcRouteHandler());result.Values.Add("controller", "Legacy");result.Values.Add("action", "GetLegacyURL");result.Values.Add("legacyURL", requestedURL);}return result;}public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values){return null;}} }這個(gè)類的構(gòu)造函數(shù)接受一個(gè)字符串?dāng)?shù)組,代表網(wǎng)址將支持路由類。我們會(huì)指定這些當(dāng)我們以后注冊的路由。GetRouteData方法,這就是路由系統(tǒng)調(diào)用來看看我們是否能夠處理傳入U(xiǎn)RL。
如果我們不能處理的要求,那么我們可以直接返回null,路由機(jī)制將移動(dòng)到列表中的下一個(gè)路由并重復(fù)這個(gè)過程。如果我們能夠處理的請求,我們需要返回一個(gè)RouteData類包含控制器和操作變量的值的實(shí)例,別的我們要傳遞的操作方法。接下來我們需要注冊一條路由,具體的代碼在Global.asax添加如下:
我們創(chuàng)建一個(gè)新的類的實(shí)例傳遞的URL希望它來自路由。然后,我們添加RouteCollection使用Add方法。現(xiàn)在,當(dāng)我們要求舊的URL在我們自定義的類,路由請求和導(dǎo)演對我們的控制器如下圖1所示。
圖1.
生成外向的URL
為了支持即將向外生成的URL,我們需要實(shí)現(xiàn)的GetVirtualPath方法。如果我們無法處理請求,我們讓路由系統(tǒng)知道返回null。否則,我們返回一個(gè)的VirtualPathData類的實(shí)例。具體修改如下代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace Routing_Project.Infrastructure {public class LegacyRoute : RouteBase{private string[] urls;//構(gòu)造函數(shù)public LegacyRoute(params string[] targetUrls){this.urls = targetUrls;}public override RouteData GetRouteData(HttpContextBase httpContext){RouteData result = null;//獲取應(yīng)用程序的虛擬目錄string requestedURL = httpContext.Request.AppRelativeCurrentExecutionFilePath;if (this.urls.Contains(requestedURL,StringComparer.OrdinalIgnoreCase)){result = new RouteData(this, new MvcRouteHandler());result.Values.Add("controller", "Legacy");result.Values.Add("action", "GetLegacyURL");result.Values.Add("legacyURL", requestedURL);}return result;}public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values){VirtualPathData result = null;if (values.ContainsKey("legacyURL")&& this.urls.Contains((string)values["legacyURL"],StringComparer.OrdinalIgnoreCase)){result = new VirtualPathData(this, new UrlHelper(requestContext).Content((string)values["legacyURL"]).Substring(1)); }return result;}} }我們已經(jīng)通過細(xì)分變量和其他細(xì)節(jié)在使用匿名類型,但幕后,路由系統(tǒng)已RouteValueDictionary對象轉(zhuǎn)換成這些。因此我們添加這么一個(gè)視圖代碼如下:
@Html.ActionLink("Click me", "GetLegacyURL", new { legacyURL = "~/articles/Windows_3.1_Overview.html" })創(chuàng)建與legacyURL屬性的匿名類型轉(zhuǎn)換成RouteValueDictionary類包含同名的關(guān)鍵。在這個(gè)例子中,我們決定,我們可以處理一個(gè)請求外出URL,如果有名為legacyURL一個(gè)關(guān)鍵,如果它的值是一個(gè)URL,被傳遞到構(gòu)造。我們可以更具體和檢查控制器和行動(dòng)值,在簡單的應(yīng)用中這些應(yīng)該可以滿足的!
創(chuàng)建一個(gè)自定義路由處理程序
我們依靠MvcRouteHandler在我們的路由,因?yàn)樗B接到MVC的路由機(jī)制。由于我們的重點(diǎn)是MVC框架,這是我們想要的幾乎所有的時(shí)間關(guān)注的。既然如此,路由機(jī)制,讓我們定義我們自己的路由處理實(shí)施IRouteHandler接口。具體代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Routing;namespace Routing_Project.Infrastructure {public class CustomRouteHandler : IRouteHandler{public IHttpHandler GetHttpHandler(RequestContext requestContext){return new CustomHttpHandler();}}public class CustomHttpHandler : IHttpHandler{public bool IsReusable{get { return false; }}public void ProcessRequest(HttpContext context){context.Response.Write("Hello");}} }接口的IRouteHandler的目的是提供一種方法來生成的實(shí)現(xiàn)IHttpHandler接口,這是負(fù)責(zé)處理請求。在MVC實(shí)現(xiàn)控制器被發(fā)現(xiàn),這些接口,調(diào)用的操作方法,觀點(diǎn)呈現(xiàn),結(jié)果
被寫入響應(yīng)。我們的實(shí)現(xiàn)是簡單一點(diǎn)。它只是寫的字打招呼客戶端(不含有這個(gè)詞的一個(gè)HTML文件,但只是文本)。OK,我們依然還是需要注冊路由,具體如下:
運(yùn)行項(xiàng)目,我們訪問“?URL? /SayHello”,結(jié)果如下圖2
圖2.
處理領(lǐng)域
MVC框架支持組織一個(gè)web應(yīng)用程序到的區(qū)域,每個(gè)區(qū)域代表應(yīng)用程序的功能性組比如賬單、客戶支持,等等,這在一個(gè)大的項(xiàng)目是非常有用的,那里有一套單一的文件夾,所有的控制器,視圖和模型可以變得難以管理。每個(gè)MVC區(qū)域是有自己的文件夾結(jié)構(gòu),允許您分開管理。這使得它更顯而易見哪個(gè)項(xiàng)目元素相互關(guān)聯(lián)應(yīng)用程序的功能區(qū)域,這有助于多個(gè)開發(fā)人員同事處理項(xiàng)目而沒有彼此胡想不干擾。區(qū)域是支持主要通過路由機(jī)制。
我們從新新建一個(gè)MVCweb應(yīng)用程序("MVCArea"),創(chuàng)建好項(xiàng)目,我們直接演示怎么給項(xiàng)目添加一個(gè)區(qū)域進(jìn)來具體如下圖3.-4.
圖3.圖4.當(dāng)我們創(chuàng)建好我們的區(qū)域之后項(xiàng)目的結(jié)構(gòu)會(huì)變成如下圖5所示。
圖5.OK這里你可以看一套類似與MVC文件機(jī)制東東出來,這個(gè)就是我們創(chuàng)建的區(qū)域關(guān)于這個(gè)東西后面慢慢來學(xué)習(xí)他,我們現(xiàn)在只關(guān)心他那個(gè)自動(dòng)創(chuàng)建AdminAreaRegistration.cs的文件里面是怎么一回事,不看內(nèi)容就憑著這個(gè)名字猜一下,大概就路由扯上關(guān)系了。OK,打開看看,AdminAreaRegistration.cs的代碼如下:
using System.Web.Mvc;namespace MvcArea.Areas.Admin {public class AdminAreaRegistration : AreaRegistration{public override string AreaName{get{return "Admin";}}public override void RegisterArea(AreaRegistrationContext context){context.MapRoute("Admin_default","Admin/{controller}/{action}/{id}",new { action = "Index", id = UrlParameter.Optional });}} }OK,可以看出上面代碼我加粗標(biāo)識(shí)的RegisterArea方法十分有意思,在這個(gè)區(qū)域里注冊一個(gè)路由的URL模式"? Admin/{controller}/{action}/{id}",當(dāng)然我們可以在這里定義其他的URL模式,但是你要知道你這這里定義的話只在該區(qū)域里有效,也就是你額外定義的路由機(jī)制的持有權(quán)在該區(qū)域內(nèi)。
我們不需要采取任何行動(dòng)來確保這個(gè)注冊方法被調(diào)用。因?yàn)镚lobal.asax文件里的Application_Start方法在我們創(chuàng)建區(qū)域的時(shí)候?yàn)樽詣?dòng)為我們注冊進(jìn)去,那么我們來打開Global.asax文件里的Application_Start方法看看,具體代碼如下:
protected void Application_Start(){AreaRegistration.RegisterAllAreas();RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);}可以看到是OK的,接下我們在我們創(chuàng)建的Admin區(qū)域里添加一個(gè)控制器("Controller")和方法("Action")和一些視圖("View")來看看效果,首先添加一個(gè)控制器("Controller"),如下圖6.
圖6.創(chuàng)建HomeController,具體的代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;namespace MvcArea.Areas.Admin.Controllers {public class HomeController : Controller{//// GET: /Admin/Home/public ActionResult Index(){return this.View();}} }OK,我們在創(chuàng)建一個(gè)視圖,如下圖7.
圖7。創(chuàng)建好Index.cshtml,頁面的代碼如下:
@{ViewBag.Title = "Index"; }<h2>Admin Area Index</h2>OK,我們試著運(yùn)行一下我們的Web項(xiàng)目,并且訪問一下他的路由"?/Admin/Home/Index",結(jié)果如下圖8.
圖8.
貌似我們?nèi)隽艘粋€(gè)謊言,我們試著訪問一下我們web項(xiàng)目的根路徑看看什么效果,運(yùn)行如下圖9.
圖9.
OK,MVC路由機(jī)制一下找到了2個(gè)"HomeController"這下不知道去那個(gè),就出錯(cuò)了!
當(dāng)一個(gè)地區(qū)注冊,任何路由,我們定義僅限于名稱空間關(guān)聯(lián)該區(qū)域。這就是我們?yōu)槭裁凑埱?#34;?/Admin/Home/Index "的時(shí)候。路由機(jī)制找到"HomeController"的命名空間MvcArea.Areas.Admin.Controllers。但是?Global.asax文件的機(jī)制可不是這個(gè)樣子的,來看看我們默認(rèn)的?Global.asax文件是怎么搞的,具體代碼如下:
public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute("Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults);}名為default的路由轉(zhuǎn)換傳入的URL從瀏覽器到主控制器HomeController行動(dòng)上Index方法。在這一點(diǎn)上,我們得到一個(gè)錯(cuò)誤,因?yàn)橛袥]有命名空間的限制這條路線和MVC框架,可以看到兩個(gè)的HomeController類。所以我們就可以看到上面悲劇發(fā)生,我們對Global.asax文件做簡單的處理,具體操作如下:
public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute("Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaultsnew[] { "MvcArea.Controllers" });}這種變化,確保在控制器的主要項(xiàng)目,給予優(yōu)先解決的請求。
MVC框架中檢測到當(dāng)前的請求與特定的區(qū)域, 然后出站的URL生成將會(huì)找到一個(gè)匹配只有在路線定義為該領(lǐng)域。比如在我們的Index.cshtml修改如下代碼所示:
@{ViewBag.Title = "Index"; }<h2>Admin Area Index</h2> @Html.ActionLink("Cilck me", "About")運(yùn)行項(xiàng)目,可以看到如下圖10的生成的連接.
圖10.
當(dāng)然也可以修改如下代碼所示(創(chuàng)建一個(gè)鏈接到一個(gè)動(dòng)作在不同的區(qū)域,或沒有區(qū)域內(nèi),您必須創(chuàng)建一個(gè)變量調(diào)用地區(qū)并使用它來指定區(qū)域的名字你想要的):
@{ViewBag.Title = "Index"; }<h2>Admin Area Index</h2> @Html.ActionLink("Cilck me", "About") <br /> @Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" })運(yùn)行的效果如下圖11.
圖11.OK,關(guān)于路由就西安分享到這里(后續(xù)遇到什么在繼續(xù)補(bǔ)充吧),文章要是那里有描述有誤的地方,還請各位前輩多多批評(píng)指導(dǎo),大家共同學(xué)習(xí)!
寶劍鋒從磨礪出,梅花香自苦寒來!一起努力ing.....總結(jié)
以上是生活随笔為你收集整理的Asp.Net MVC 3【URLs, Routing,and Areas】续的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java反射,参数为数组
- 下一篇: 12月中国域名服务商Top20市场份额解