Вопрос по routing, asp.net-mvc-3, format – Основы маршрутизации MVC3

2

Я учусь MVC маршрутизации. Надеюсь, мой вопрос не выглядит глупым, и, пожалуйста, помогите :)

<code>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
    );
</code>

В справочнике Msdn сказано, что для этого требуются строки, строки, объекты, поэтому я пытаюсь внести небольшое изменение (добавив «мой» перед всем, просто чтобы изменить имена и посмотреть, работает ли он):

<code>    public static void RegisterRoutes(RouteCollection routes) {
        routes.IgnoreRoute("{myresource}.axd/{*mypathInfo}");

        routes.MapRoute(
            "myDefault", // Route name
            "{mycontroller}/{myaction}/{myid}", // URL with parameters
            new { mycontroller = "Home", myaction = "Index", myid = UrlParameter.Optional } // Parameter defaults
        );
</code>

Это больше не работает. Каков формат этих строк в & quot; {} & quot; фигурные скобки и форматы значений анонимных объектов.

{Контроллер} / {действие} / {ID} / Продукция / шоу / напитки

{Таблица} /Details.aspx /Products/Details.aspx

блог / {действие} / {запись} / Блог / показать / 123

{ReportType} / {год} / {месяц} / {день} / продажи / 2008/1 / 5

{Локали} / {действие} / США / показать

{Язык} - {страна} / {действие}  / EN-US / показать

{Контроллер} / {действие} / {ID} Http: // сервер / приложение / Продукты / шоу / напитки

{Ресурс} .axd / {*} Pathinfo HTTP: //server/application/WebResource.axd д =...

Я гуглял вокруг, но все посты, похоже, предполагают, что я знаю форматы, и не смогли найти подробного объяснения. Должны ли они быть фиксированными именами, такими как {controller} {action} {id} и т. Д., Или они выиграли & apos; т работаешь? Должны ли имена имен анонимных объектов по умолчанию соответствовать им? Кроме того, что означает "*" Я имею в виду {* pathInfo}, я не могу найти объяснение этому, не знаю. Спасибо.

Ваш Ответ

1   ответ
7

Давайте разберем маршрут по умолчанию.

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

В этом случае Default в строке 2 - это просто текстовое имя, используемое для идентификации маршрута.

В строке 3 - шаблон URL. Это определяет соответствие маршрута. вещи в фигурных скобках являются заполнителями. Они отображаются на имена параметров. поэтому {controller} отображается на имя контроллера. {action} отображается на имя действия, а {id} - на параметр с именем id.

В строке 4 находится объект по умолчанию. Этот объект предоставляет значения по умолчанию, когда они не могут быть выведены из URL.

Итак, если мы возьмем все это вместе, вот некоторые выводы, которые мы можем сделать:

объекты по умолчанию предоставляют значения только тогда, когда они не могут быть выведены из строки URL. Таким образом, когда входящий запрос просто/значения dfault из строки 4 используются для контроллера и действия. Если входящий запрос/Blah, тогда контроллер по умолчанию, предоставленный в строке 4, игнорируется, и вместо этого MVC ищетBlahController, Однако, поскольку не было указано никакого действия, используется действие по умолчанию из строки 4Index.

Здесь следует помнить, что значения в строке 4 используются только в том случае, если ничто не соответствует URL в строке 3.

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

Другой пример:

routes.MapRoute(
    "Example",
    "Home/{action}/{myid}",
    new { controller = "NotHome", action = "Index", myid = UrlParameter.Optional }
);

Потому что нет{controller} заполнитель в URL-адресе, затем значение по умолчанию "NotHome" используется, что заставляет MVC искатьNotHomeController, Так что URL/Home/About/3 будет означать, что контроллер = "NotHome", action = "About" и myid = 3.

В общем, во входящем маршруте,something должен заполнить значение для контроллера и действия как минимум. Идентификатор необязателен и может быть переименован в любое, что вам нравится. Но что-то должно устанавливать контроллер и параметры действия, иначе MVC не знает, как что-то маршрутизировать.

Кроме того, помните, что маршрут по умолчанию (или эффективный маршрут по умолчанию) должен стоять последним в списке, иначе никакие другие маршруты не будут сопоставлены.

{*pathInfo} Бит называется слизень. в основном это подстановочный знак, говорящий «все, что после этой точки, вставлено в параметр с именем pathInfo». Таким образом, если у вас есть"{resource}.axd/{*pathInfo}" и URL-адрес, как это:http://blah/foo.axd/foo/bar/baz/bing затем создаются два параметра, один называетсяresource, который будет содержатьfoo и один называетсяpathInfo который содержитfoo/bar/baz/bing.

Благодарю. Мне нужно было только"Also, remember, the default route (or an effective default route) must come last in the list, otherwise no other routes will be matched." :)
@ Том - Нет. Как я показал в моем примере, вам не нужно{controller} в URL, но выDO нужен контроллер и параметр действия, будь то из URL или объекта по умолчанию.
Спасибо за помощь. Я также нахожу это, некоторые специальные имена параметров требуются ASP.NET MVC. Например, {controller} для создания экземпляра класса контроллера и {action} для указания метода для вызова. Итак, эти двое и несколько других (я полагаю, что я еще не знаю полностью). Это жестко заданные имена параметров. Tom

Похожие вопросы