2011-07-06 5 views
2

を複製、私は私の主にHomeController(エリア上のナビゲーションアクションを持っています=私は私の管理ポータブルエリアに別のにHomeControllerを追加するまで、「」)私は私のSite.MasterからMVC先物強く型付けされたRenderActionと私はMVC先物ライブラリ</p> <p>から強く型付けされた自然の中でHtml.RenderActionを使用しようとしているコントローラ名と

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

を呼び出すようにしようとしていることをこれがとてもうまくいきました。それから私は、次のエラーのため開始:

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メソッドのソースを見つけ、コントローラの名前空間からその領域を解析し、処理する前に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}"、新しい{コントローラ= "ホーム"、アクション= "インデックス"、ID = UrlParameter.Optional}、new [] {"Web.Controllers"}); –

関連する問題