asp.net mvc проблемы маршрутизации - PullRequest
1 голос
/ 18 января 2011

Я добавил эту маршрутизацию в свой глобальный asax.

routes.MapRoute(
    "News", // Route name
    "News/{timePeriod}/{categoryName}/{page}", // URL with parameters
    new { controller = "News", action = "Index", 
        timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 },
    new { page = @"^\d{1,3}$" }// Parameter defaults
);

routes.MapRoute(
    "News2", // Route name
    "News/{categoryName}/{page}", // URL with parameters
    new { controller = "News", action = "Index", 
        timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 },
    new { page = @"^\d{1,3}$" }// Parameter defaults
);

Проблема в том, что URL-адреса вроде / News / add не будут работать (если я не добавлю конкретный маршрут), есть лучший способ без указанияURL действия в глобальном asax?

Ответы [ 2 ]

0 голосов
/ 18 января 2011

Каждый из двух указанных выше маршрутов будет направлять вас к контроллеру новостей и выполнять действие «Индекс». Если у вас нет перегрузок для действия Index, которое примет заданные вами параметры, тогда маршрут не будет работать должным образом. Например, у вас должны быть следующие два действия:

public ActionResult Index(TimePeriod timePeriod, string categoryName, int page) {..}

public ActionResult Index(string categoryName, int page) {..}

Кроме того, вы должны удалить параметр TimePeriod по умолчанию из вашего второго маршрута, поскольку вы не используете его в самом маршруте:

routes.MapRoute(
                "News2", // Route name
                "News/{categoryName}/{page}", // URL with parameters
                new { controller = "News", action = "Index", categoryName = "All", page = 1 },
                new { page = @"^\d{1,3}$" }// Parameter defaults
            );

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

routes.MapRoute(
                "News", // Route name
                "News/{action}/{timePeriod}/{page}", // URL with parameters
                new { controller = "News", action = "Index", timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 },
                new { page = @"^\d{1,3}$" }// Parameter defaults
            );

Затем действие для каждой категории:

public ActionResult All(TimePeriod timePeriod, string categoryName, int page) {..}

public ActionResult Sports(TimePeriod timePeriod, string categoryName, int page) {..}

public ActionResult Weather(TimePeriod timePeriod, string categoryName, int page) {..}

Таким образом, все, что вам нужно, это один маршрут.

0 голосов
/ 18 января 2011

Я думаю, что бы это поймать. Но только если вы не передадите никаких дополнительных аргументов, таких как id (потому что это очень похоже на маршрут News2).

routes.MapRoute(
"News0",
"News/{action}",
new { controller = "News", action = "Index" }
);

Также попробуйте Routing Debugger для проверки желаемого эффекта: ссылка

...