T4MVC и дублирующийся контроллер называют в различных областях

В моем приложении мне назвали контроллер Snippets оба в области по умолчанию (в корневом каталоге приложения) и в моей названной области Manage. Я использую T4MVC и пользовательские маршруты, как это:

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

И я получаю эту ошибку:

Несколько типов были найдены тем соответствием контроллер, названный 'отрывками'. Это может произойти, если маршрут, который обслуживает этот запрос (' {контроллер} / {действие} / {идентификатор} / ') не указывает пространства имен для поиска контроллера, который соответствует запросу. Если это верно, зарегистрируйте этот маршрут путем вызова перегрузки метода 'MapRoute', который берет параметр 'пространств имен'.

Запрос на 'отрывки' нашел следующие контроллеры соответствия: Отрывки. Контроллеры. Отрывки SnippetsController. Области. Справиться. Контроллеры. SnippetsController

Я знаю, что существуют перегрузки для MapRoute то взятие 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}           
);

Заранее спасибо!

5
задан artvolk 8 May 2010 в 13:06
поделиться

1 ответ

Имеет смысл. Думаю, вы просто первый, кто с этим столкнулся. Попробуйте заменить все методы MapRoute в T4MVC.tt на следующие:

    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.

В любом случае, пожалуйста, просмотрите и протестируйте это изменение, и дайте мне знать, как оно работает у вас. Если оно выглядит хорошо, я введу его.

Спасибо!

5
ответ дан 14 December 2019 в 19:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: