2010-08-04 68 views
8

更新2UrlHelper.Action不映射到該地區,該控制器是正確

好了 - 所以它看起來像我的問題再次略微改變:-)

我已經意識到現在UrlHelper.Action似乎不能正確解析任何區域中的URL,除非明確指定區域名稱。如果沒有指定它,它似乎會返回我們當前所在的區域名稱,使得它看起來像是從站點的一部分開始工作,但是另一個區域中的同一鏈接會解析爲錯誤的區域名稱。

要麼我做了一些時髦的事情,使它做到這一點,或者我不完全理解這個Action方法是如何工作的。

更新1

我可以通過以下操作,使這項工作:

return helper.Action("add", "product",new {area = "storemanagement"}); 

稍微改變了我的問題。

爲什麼MVC路由不會消除具有相同名稱的控制器的歧義並解決指定了操作方法的控制器?

原始發佈

嘿大家,

我創建的UrlHelper類的輔助方法時遇到一個小問題的途徑之一。

下面是有問題的輔助方法代碼:

public static string AddProduct(this UrlHelper helper) 
     { 
      return helper.Action("add", "product"); 
     } 

我基本上有一個名爲「產品」兩個控制器這是在網站的不同區域。其中一個用於瀏覽產品,另一個用於產品管理。只有一個產品控制器包含一個操作方法「添加」。

當我輸出addProduct命令

<%: Url.AddProduct() %> 

的值的區域名稱解析爲我瀏覽當前區域和不含有添加操作方法的產品控制器正確的區域。

有什麼我需要在路線中設置?我不確定路由如何與UrlHelper.Action協同工作,所以我不知道是否有可能做我想要的。

乾杯任何幫助。

+1

嘗試添加控制器和區域名稱作爲附加參數使用此方法sig UrlHelper.Action方法(字符串,字符串,對象)' – Ahmad 2010-08-04 12:28:10

+0

謝謝艾哈邁德。這實際上工作,所以我會添加它作爲我的問題的更新。我仍然感興趣的是爲什麼路由系統不會消除這兩個控制器的歧義,而是似乎放棄並假定使用當前區域。 – 2010-08-04 12:50:18

+0

回答你的問題,需要深入挖掘MVC框架的內部,找出發生這種情況的原因。無論如何,根據我所看到的,只有「控制器」和「行動」路線值有特殊的處理方式,也就是說,根據你呼叫輔助者的地方,區域是有點推斷/假定的。因此需要指定區域參數。 – Ahmad 2010-08-04 16:26:45

回答

1

這是ASP.NET路由的默認行爲。

在「區域」中,通過控制器和動作名稱在默認位置搜索動作(和視圖)。 除非在動作中另有說明,否則視圖被假定爲ActionName。return PartialView("_MyPartialView.cshtml", ViewModel)

默認位置是這些:{控制器} =控制器名稱,{地區} =區域名稱

控制器:

"Areas/{Area}/{Controller}/" 
"Controllers/{Controller}" 

瀏覽:

"Areas/{Area}/Views/{Controller}/" 
"Areas/{Area}/Views/Shared/" 
"Views/Shared" 

如果你不」不給區域的路線值,它將永遠不會在這些位置之外搜索。該區域與您撥打助手的位置相同。如果你是在根級別(而不是在一個區域)將被限制在

"Controllers/{Controller}" // controller 
"Views/{Controller}/" // views 
"Views/Shared" // views 

的問題是,你在其中一個區域1是搜索 "Areas/Area1/{Controller}/",當你在區域2它搜索"Areas/Area2/{Controller}/"(並且都搜索了Controllers/ProductControllers/Shared)。當你在正確的區域找到它時,它能夠找到它,因爲它適合默認的搜索位置,而不是在其他區域,因爲控制器只在一個物理區域。

像你一樣添加區域,告訴它在預定義區域中搜索,以便它直接進入。 "Areas/Storemanagement/Views/product/"並搜索Add Action中定義的視圖。

有一個返回Url.Action方法的空幫助方法沒什麼意義,但也許這只是爲了演示。

(我只注意到這個問題是很老,但我想這可能是這裏備查)

1

只需把答案爲清晰起見,答案部分...

你需要每當您使用UrlHelper.Action生成鏈接路徑時,將Area添加到RouteValues

如果你的控制器,可以stub a UrlHelper這樣的:

var httpContext = new HttpContextWrapper(System.Web.HttpContext.Current); 
var requestContext = new RequestContext(httpContext, new RouteData()); 
var urlHelper = new UrlHelper(requestContext); 

您可以隨時get the current area這樣的:

HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"] 

最後,使用UrlHelperpass the area in the RouteValues object這樣的時候:

var url = urlHelper.Action("Index", "Home", new { area = "Pages" }));