2012-06-18 3 views
2

У меня есть контроллер запросов, который выходит из-под контроля, и я хочу разделить действия на нескольких контроллерах при сохранении чистого URL-адреса. Я пытаюсь экспериментировать с маршрутизацией, но безуспешно. Я прочитал несколько примеров и руководств по маршрутизации, но, хотя я понимаю примеры, ничто, кажется, не относится к моему делу, и я чувствую себя неразумным. Я хочу, чтобы URL-адрес Requests/Approval обрабатывался на моем ConfirmController вместо моего RequestController, поэтому я написал следующее.MVC-маршрутизация против частичного класса

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

     routes.MapRoute(
      "Approval", 
      "Request/{controller}/{action}", 
      new { controller = "Approval", action="Index", id = "" } 
     ); 

    } 

Но это не работает. Зачем? У меня есть папка в моих представлениях под названием «Утверждение», и там есть файл с именем Index.cshtml. Как мне закодировать MapRoute?

Редактировать

Я добавил все маршруты у меня

+2

Можете ли вы показать заказ, на котором вы сопоставляете другие маршруты? Возможно, другой маршрут соответствует одному и тому же запросу. – awbergs

+0

У меня только стандартный маршрут «из коробки», иначе. Я обновил вопрос, чтобы вы могли видеть функцию «RegisterRoutes». –

+0

Одна вещь, которую следует учитывать при маршрутизации, заключается в том, что маршруты оцениваются по порядку, и как только маршрут совпадает с тем, который используется, поэтому по умолчанию сначала его не следует искать. Вы можете указать маршрут по названию, которое в данном случае является «одобрением» – Brian

ответ

5

Вам нужно поменять местами два заявления MapRoute, например, так:

routes.MapRoute(
    "Approval", 
    "Request/Approval/{action}", 
    new { controller = "Approval", action="Index", id = "" } 
); 

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

Причина, по которой в настоящее время не работает потому что первый оператор («Имя по умолчанию») согласовывается до того, как второй оценивается.

Кроме того, как указано в моем примере выше, вам необходимо удалить '{controller}' в маршруте утверждения и заменить на «Утверждение» ... если вы специально не хотите, чтобы URL/Request/{ANY controller}/{action} пройти, что я сомневаюсь. Из вашего вопроса кажется, что вы только хотите/Запрос/утверждение /, чтобы перейти к контроллеру одобрения.

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

+0

Это сделало трюк. Я предполагаю, что это связано с тем, что у меня одинаковое количество параметров в обоих URL-адресах, но почему оно не продолжает искать альтернативные маршруты, прежде чем я узнаю, что файл не существует? –

+0

Непостижимо с этим. Теперь, если вы попытаетесь вызвать действие на RequestController, MVC будет искать контроллер с тем же именем, что и действие. –

+0

@KyleTrauberman Вы правы, я только что опубликовал мое предупреждение об изменении – Joshua

1

Порядок размещения информации о маршрутах. Переместите второй маршрут до маршрута по умолчанию.

У вас все еще будет проблема, хотя, как и любая вещь /request/something будет искать SomethingContoller. Чтобы исправить это, измените свой маршрут на это:

routes.MapRoute(
     "Approval", 
     "Request/Approval/{action}", 
     new { controller = "Approval", action="Index", id = "" } 
    ); 
+0

Спасибо за ввод. Это был мой первый подход, но это не сработало. Я попробовал @joshuam предложение, и это сделало трюк. –

Смежные вопросы