Как перенаправить URL устаревшего типа в ASP.NET MVC - PullRequest
1 голос
/ 13 октября 2009

Из-за факторов, не зависящих от меня, мне нужно обрабатывать URL-адреса следующим образом:

Я бы хотел направить их к определенному контроллеру / действию с уже проанализированным и связанным val (т. Е. Аргументом к действию).

В идеале мое действие должно выглядеть так:

ActionResult BackwardCompatibleAction(int val)

Я нашел этот вопрос: ASP.Net MVC маршрутизирует устаревшие URL-адреса, передающие идентификаторы строки запроса в действия контроллера , но перенаправления не принимаются.

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

Мне удалось перенаправить запрос с помощью:

routes.MapRoute(
    "dosomething.asp Backward compatibility",
    "{dosomething}.asp",
    new { controller = "MyController", action = "BackwardCompatibleAction"}
);

Однако, оттуда единственный способ получить значение val =? это через Request.QueryString. Хотя я мог бы проанализировать строку запроса внутри контроллера, это усложнило бы тестирование действия, и я бы предпочел не иметь этой зависимости.

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

1 Ответ

3 голосов
/ 13 октября 2009

Параметр val в вашем методе BackwardCompatibleAction должен автоматически заполняться значением строки запроса. Маршруты не предназначены для работы со строками запроса. Решение, которое вы перечислили в своем вопросе, кажется мне правильным. Вы пробовали это, чтобы увидеть, что происходит?

Это также будет работать для вашего маршрута. Поскольку вы указываете и контроллер, и действие, вам не нужен параметр фигурной скобки.

routes.MapRoute(
    "dosomething.asp Backward compatibility",
    "dosomething.asp",
    new { controller = "MyController", action = "BackwardCompatibleAction"}
);

Если вам нужно параметризовать имя действия, то должно сработать что-то вроде этого:

routes.MapRoute(
    "dosomething.asp Backward compatibility",
    "{action}.asp",
    new { controller = "MyController" }
);

Это даст вам более общий маршрут, который может соответствовать нескольким разным URL-адресам страниц .asp в методах Action.

http://www.bob.com/dosomething.asp?val=42 будет маршрут к MyController.dosomething(int val)

и http://www.bob.com/dosomethingelse.asp?val=42 будет маршрут к MyController.dosomethingelse(int val)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...