2

MVC Futures ライブラリの強く型付けされた性質の Html.RenderAction を使用しようとしています

Site.Master から呼び出そうとしているプラ​​イマリ HomeController (area = "") に Navigation アクションがあります。

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

別の HomeController を管理者のポータブル領域に追加するまで、これはうまく機能しました。その後、次のエラーが発生しました。

「Home」という名前のコントローラーに一致する複数のタイプが見つかりました。これは、このリクエストを処理するルートが、リクエストに一致するコントローラを検索するための名前空間を指定していない場合に発生する可能性があります。この場合は、'namespaces' パラメーターを取る 'MapRoute' メソッドのオーバーロードを呼び出して、このルートを登録します。

「ホーム」のリクエストにより、次の一致するコントローラーが見つかりました: 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" });
4

2 に答える 2

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);
}
于 2011-07-08T11:35:35.167 に答える
0

MVC で複数のコントローラーをサポートするには、名前空間をデフォルト ルートに追加する必要があります。

詳細については、この回答を参照してください:質問 2627699

于 2011-07-06T14:26:49.847 に答える