ASP.NET MVC 3 - Edge case с маршрутизацией в области - PullRequest
1 голос
/ 21 июля 2011

У меня есть страница, где пользователь может «Задать вопрос» на товар.

Маршрут:

context.MapRoute(
                "Q&A - Ask - by Product",
                "{someProductUri}/questions/ask",
                new { controller = "Questions", action = "Ask" }
            );

Что соответствует:

/ автомобиль / вопросы / предложения

/ телефон / вопросы / предложения

Вот действие:

public class QuestionsController : Controller
{
    public ViewResult Ask(string someProductUri)
    {
      // ...
    }
}

Теперь проблема в том, что мне также нужно разрешить пользователю выбирать продукт на самой странице, например, без предварительного выбора продукта в URI.

Поскольку этот контроллер находится в области , этот «URL по умолчанию» будет выглядеть следующим образом:

/ myarea / вопросы / предложения

Итак, что происходит, когда я приступаю к действию, «someProductUri» устанавливается в «myarea», вызывая всевозможные страдания.

Я хочу повторно использовать одно и то же действие / представление для обоих наборов URL-адресов, но не хочу, чтобы значение маршрута было установлено в «myarea», когда это URL-адрес по умолчанию.

Надеюсь, что имеет смысл - есть идеи?

Мне нужен отдельный маршрут? Могу ли я добавить ограничение маршрута, чтобы «someProductUri» не могло быть «myarea», чтобы оно не совпадало с маршрутом и возвращалось к значению по умолчанию?

Ответы [ 2 ]

3 голосов
/ 21 июля 2011

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

Итак, я использовал ограничение маршрута:

public class NotEqualToAreaName : IRouteConstraint
{
   public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
   {
      return String.Compare(values[parameterName].ToString(), route.DataTokens["area"].ToString(), true) != 0;
   }    
}

Довольно просто и универсально - так что я могу использовать его в любое время, когда сталкиваюсь с этим типом крайнего случая.

2 голосов
/ 21 июля 2011

Вам необходимо добавить отдельный маршрут для области:

context.MapRoute(
            "Q&A - Ask - by Product",
            "myarea/questions/ask",
            new { controller = "Questions", action = "Ask" }
        );
...