5

私のアプリケーションではSnippets、デフォルト領域(アプリケーションルート内)と私の領域の両方にという名前のコントローラーがありますManage。私はT4MVCとカスタムルートを次のように使用します:

routes.MapRoute(
    "Feed",
    "feed/",
    MVC.Snippets.Rss()
);

そして、私はこのエラーを受け取ります:

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

'スニペット'のリクエストにより、一致する次のコントローラーが見つかりました:Snippets.Controllers.SnippetsController Snippets.Areas.Manage.Controllers.SnippetsController

MapRouteそのtake引数にはオーバーロードがあることは知っていますがnamespaces、T4MVCサポートではそのようなオーバーロードはありません。何かが足りないのでしょうか?可能な構文は次のとおりです。

routes.MapRoute(
    "Feed",
    "feed/",
    MVC.Snippets.Rss(),
    new string[] {"Snippets.Controllers"}           
);

または、T4MVCプロパティとして名前空間を使用することは私には非常に良いようです。

routes.MapRoute(
    "Feed",
    "feed/",
    MVC.Snippets.Rss(),
    new string[] {MVC.Snippets.Namespace}           
);

前もって感謝します!

4

1 に答える 1

5

理にかなっています。私はあなたがこれに遭遇した最初の人だと思います。T4MVC.ttのすべてのMapRouteメソッドを次のように置き換えてみてください。

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result) {
        return MapRoute(routes, name, url, result, null /*namespaces*/);
    }

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result, object defaults) {
        return MapRoute(routes, name, url, result, defaults, null /*constraints*/, null /*namespaces*/);
    }

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result, string[] namespaces) {
        return MapRoute(routes, name, url, result, null /*defaults*/, namespaces);
    }

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result, object defaults, object constraints) {
        return MapRoute(routes, name, url, result, defaults, constraints, null /*namespaces*/);
    }

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result, object defaults, string[] namespaces) {
        return MapRoute(routes, name, url, result, defaults, null /*constraints*/, namespaces);
    }

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result, object defaults, object constraints, string[] namespaces) {
        // Start by adding the default values from the anonymous object (if any)
        var routeValues = new RouteValueDictionary(defaults);

        // Then add the Controller/Action names and the parameters from the call
        foreach (var pair in result.GetRouteValueDictionary()) {
            routeValues.Add(pair.Key, pair.Value);
        }

        var routeConstraints = new RouteValueDictionary(constraints);

        // Create and add the route
        var route = new Route(url, routeValues, routeConstraints, new MvcRouteHandler());

        if (namespaces != null && namespaces.Length > 0) {
            route.DataTokens = new RouteValueDictionary();
            route.DataTokens["Namespaces"] = namespaces;
        }

        routes.Add(name, route);
        return route;
    }

T4MVCの助けがなくても、次のように書くだけで、コントローラーの名前空間に強い型を付けることができることに注意してください。

 string[] { typeof(MyApplication.Controllers.SnippetsController).Namespace }

理想的には、特定のコントローラーをターゲットにする意図はMVC.Snippets.Rss()呼び出しで既にキャプチャされているため、名前空間を渡す必要はまったくありません。ただし、T4MVCに大きな変更を加えることなく、この機能を実現するための明確な方法を見つけることができませんでした。

とにかく、変更を確認してテストし、それがどのように機能するかを教えてください。よさそうなら入れます。

ありがとう!

于 2010-05-09T05:19:45.287 に答える