Как выбирается маршрут для генерации исходящего URL-адреса в ASP.NET MVC?

Добрый день!

Я использую ASP.NET MVC 2 и T4MVC, и кажется, что происходит какая-то магия кода.

Когда я добавляю это в таблицу маршрутов:

routes.MapRoute(
    "Login",
    "login/",
    MVC.Profile.Login()
);

Откуда фреймворк знает, что я хочу, чтобы это правило применялось, когда я пишу что-то подобное в представлении для создания исходящего URL-адреса:

<%: Url.Action(MVC.Profile.Login() %>

Что делать, если у меня есть несколько разных правил (с разными параметрами) для одной и той же пары контроллер/действие? Какой из них будет выбран? Есть ли где-нибудь хорошее описание этого поведения?

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


person artvolk    schedule 22.03.2011    source источник


Ответы (3)


Что я хотел бы предложить, чтобы помочь вам понять, как эта работа состоит в том, чтобы отделить магию, которую делает T4MVC, от того, что делает сам MVC под прикрытием.

Когда вы пишете это с помощью T4MVC:

routes.MapRoute(
    "Login",
    "login/",
    MVC.Profile.Login()
);

Это эквивалентно написанию этого с помощью прямого MVC:

routes.MapRoute(
    "Login",
    "login/",
    new { controller = "Profile", action = "Login" }
);

И в представлении:

Url.Action(MVC.Profile.Login())

Такой же как

Url.Action("Login", "Profile")

T4MVC дает вам преимущество строгой типизации/интеллектуального понимания, но, в конце концов, то, что он делает, такое же, как и с прямым MVC.

Надеюсь, это поможет немного прояснить ситуацию :)

person David Ebbo    schedule 22.03.2011
comment
Спасибо за быстрый ответ. Итак, если у меня есть два маршрута к одному и тому же контроллеру, скажем, один с параметром подкачки в форме /view/page-2 и один без /view/, мне нужно указать имя маршрута, чтобы сгенерировать URL-адрес, используя маршрут, который идет вторым в Global.asax. Насколько я помню, в T4MVC нет строго типизированных хелперов для имен маршрутов? - person artvolk; 23.03.2011
comment
Вы правы в том, что T4MVC не предоставляет строго типизированных помощников для имен маршрутов. Но вы можете получить строгую типизацию, просто определив общедоступные константы, которые вы используете как в объявлениях маршрутов, так и в представлениях. - person David Ebbo; 23.03.2011
comment
Не могли бы вы объяснить больше о том, как я могу заставить работать сильную типизацию. Я использую MvcContrib Portable Area и не могу заставить T4MVC работать, потому что представления/контроллеры возвращаются без дополнительных Areas/MyArea в пути. - person Tri Q Tran; 24.05.2011
comment
@TriQ: может иметь смысл начать новый вопрос, так как мне нужно увидеть более подробную информацию о том, что вы делаете. - person David Ebbo; 26.05.2011

Он соответствует шаблонам маршрутов в том порядке, в котором вы их определяете. Вот почему у вас есть шаблон по умолчанию как последний. Как только он находит совпадающий шаблон, он перестает искать.

Изменить

Параметры игнорируются во время сопоставления маршрутов. После выбора метода контроллера mvc использует привязку модели для назначения параметров переменным метода.

Если вы можете объяснить, какой тип структуры URL вы хотите использовать, мы, вероятно, сможем помочь вам больше.

person mdm20    schedule 22.03.2011
comment
Каковы критерии соответствия? Просто контроллер\действие или параметры тоже? - person artvolk; 22.03.2011

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

person BlackTigerX    schedule 22.03.2011
comment
Метод принимает объект, поэтому технически допустимо все. Если бы этот метод MVC.Profile.Login() возвращал класс со свойствами контроллера и действия, он бы работал нормально, не так ли? - person mdm20; 22.03.2011
comment
Вызов действительно совершенно правильный, и именно так всегда выглядят вызовы T4MVC. - person David Ebbo; 23.03.2011