2011-07-06 18 views
2

我試圖從MVC期貨庫MVC期貨的強類型使用的RenderAction區域和重複控制器名稱

我有我的主要HomeController的一個導航動作(區一個強類型的性質使用Html.RenderAction = 「」),我試圖

<% Html.RenderAction<HomeController>(x=>x.Navigation()); %> 

,直到我添加了另一個HomeController的到我的聯繫便攜式區域這真是棒極了,從我的Site.Master調用。然後,我開始了以下錯誤:

Multiple types were found that match the controller named 'Home'. This can happen if the route that services this request does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter.

The request for 'Home' has found the following matching controllers: Areas.Admin.Controllers.HomeController Web.Controllers.HomeController

我能夠通過以下非mvccontrib強類型的方法的RenderAction來解決該問題。我寧願在頁面上沒有這種非強類型的方法,是否有辦法讓mvccontrib方法接受一個區域,或者讓他們知道根據指定的路由或命名空間生成區域。

<% Html.RenderAction("Navigation", "Home", new { area = "" }); %> 

我已經加入到我的Global.asax.cs文件用默認的區域來支持多個控制器,如下圖所示,而我也驗證了這是我的控制器正確的命名空間。

_routeCollection.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new[] { "Web.Controllers" }); 

回答

2

顯然有沒有爲此在期貨項目在這個時候支持,或他們改變它,因爲期貨V1.0。我使用反射器來反彙編期貨庫,並找到RenderAction方法的源代碼,並修改它以將該區域解析出Controller的名稱空間,並在處理之前將其添加到RouteValues中。我假設我可能必須爲ActionLink做類似的事情,如果我希望它們以相同的方式行事。

下面是我使用的代碼示例,所以希望這可以幫助其他人在未來。我可能會創建表示它將解析領域,而不是過載的新方法,因爲我有迄今

public static void RenderAction<TController>(this HtmlHelper helper, Expression<Action<TController>> action) where TController : Controller 
{ 
    var ctrlNamespace = typeof(TController).Namespace; 

    int areaStart = ctrlNamespace.IndexOf(".Areas."); 
    if (areaStart > -1) 
    { 
     ctrlNamespace = ctrlNamespace.Substring(areaStart + 7); 
     int areaEnd = ctrlNamespace.IndexOf("."); 
     ctrlNamespace = ctrlNamespace.Substring(0, areaEnd); 
    } 
    else 
    { 
     ctrlNamespace = String.Empty; //default area 
    } 

    helper.ViewContext.RouteData.Values.Add("area", ctrlNamespace); 

    RouteValueDictionary routeValuesFromExpression = ExpressionHelper.GetRouteValuesFromExpression<TController>(action); 
    foreach (KeyValuePair<string, object> pair in helper.ViewContext.RouteData.Values) 
    { 
     if (!routeValuesFromExpression.ContainsKey(pair.Key)) 
     { 
      routeValuesFromExpression.Add(pair.Key, pair.Value); 
     } 
    } 

    helper.RenderRoute(routeValuesFromExpression); 
} 
+1

不錯的工作!!!!!!! –

0

爲了在MVC中支持多個控制器,您需要將命名空間添加到默認路由。

看到這個答案的更多詳細信息:Question 2627699

+0

我已經做到了這一點,我應該在我原來的文章中指出這一點。我有這在我的global.asax.cs _routeCollection.MapRoute(「默認」,「{控制器}/{行動}/{id}」,新{控制器=「家」,行動=「索引」,編號= UrlParameter.Optional},new [] {「Web.Controllers」}); –

相關問題