Маршруты MVC 2, появляющиеся в качестве параметров - PullRequest
0 голосов
/ 24 июля 2010

Я пытаюсь построить маршрут в формате {controller} {action} {классификация ID} {reviewID} {CategoryID} \

, но я хочу иметь возможность обратиться к нему без окончательного CategoryID иустановите значение по умолчанию равным 1, если оно не задано.

Вот мои маршруты:

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

        routes.MapRoute(
            "SchoolRouteNoCategory", // Route name
            "{controller}/{action}/{ClassificationID}/{ReviewID}/", // URL with parameters
            new { controller = "School", action = "Edit", ClassificationID = "SBP", ReviewID = "SAR" } // Parameter defaults
        );

        routes.MapRoute(
            "SchoolRoute", // Route name
            "{controller}/{action}/{SchoolID}/{ReviewID}/{CategoryID}/", // URL with parameters
            new RouteValueDictionary { { "action", "index" }, { "SchoolID", UrlParameter.Optional }, { "ReviewID", UrlParameter.Optional }, { "CategoryID", UrlParameter.Optional } } // Parameter defaults
        );

и вот мои подписи контроллера для действия редактирования:

    public ActionResult Edit(string SchoolID, string ReviewID) {}

    public ActionResult Edit(string SchoolID, string ReviewID, int CategoryID) {}

Первое действие редактирования просто добавит CategoryID по умолчанию и перенаправит его во второе действие редактирования.

Моя проблема заключается в том, что когда я пытаюсь создать ActionLink в своем представлении индекса, я получаю следующий URL:

http://localhost:21271/School/Edit?ClassificationID=SBP&ReviewID=SAR

где, как и должно быть,

http://localhost:21271/School/Edit/SBP/SAR/

Код для ActionLink:

<%: Html.ActionLink("Edit", "Edit", new { item.ClassificationID, item.ReviewID}) %>

У меня появляется ощущение, что я знаю еще меньшео маршрутизации, чем я думал, но большинство уроков, которые я могу найти, фокусируются только на очень простых маршрутах и ​​не затрагивают ничего сложного.Существуют ли какие-либо учебные пособия, посвященные тому типу маршрутизации, который я пытаюсь сделать?

РЕДАКТИРОВАТЬ:

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

На моей странице редактирования есть следующая ссылка ActionLink:

<%: Html.ActionLink(Model.Categories[i].name, "Edit", new { AcadPeriod = Model.AcadPeriod, ClassificationID=Model.ClassificationID, ReviewID=Model.ReviewID, CategoryID=Model.Categories[i].category_id })%>

, которая приводит к следующему URL:

http://localhost:21271/School/Edit?ClassificationID=SBP&ReviewID=SAR&CategoryID=2

ЕслиЯ запускаю отладчик маршрута и получаю следующий вывод.

Matched Route: {controller}/{action}/{AcadPeriod}/{id}
Generated URL: /School/Edit/1011/SBP/SAR/2 using the route "{controller}/{action}/{AcadPeriod}/{ClassificationID}/{ReviewID}/{CategoryID}"

Однако в таблице маршрутов говорится, что {controller} / {action} / {AcadPeriod} / {ClassificationID} / {ReviewID}/ {CategoryID} не совпадает?

Кажется, на одной странице мне говорят две разные вещи.

Это мои маршруты в global.asax в их текущем состоянии:

        routes.MapRoute(
            "SchoolRoute1",
            "{controller}/{action}/{AcadPeriod}/{ClassificationID}/{ReviewID}/{CategoryID}",
            new { controller = "School", action = "Edit", AcadPeriod = "1011", CategoryID = "1" }
        );

        routes.MapRoute(
            "SchoolRouteNoCategory",
            "{controller}/{action}/{AcadPeriod}/{ClassificationID}/{ReviewID}",
            new { controller = "School", action = "Edit", AcadPeriod = "1011", CategoryID = "1" }
        );

        routes.MapRoute(
            "SchoolRoute",
            "{controller}/{action}/{ClassificationID}/{ReviewID}/{CategoryID}",
            new { controller = "School", action = "Edit", CategoryID = "1" }
        );


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

        routes.MapRoute(
            "SchoolIndex1", // Route name
            "{controller}/{action}/{AcadPeriod}", // URL with parameters
            new { controller = "School", action = "Index", AcadPeriod = "1011" } // Parameter defaults
        );

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

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 24 июля 2010

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

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

Я думаю, что вам нужен маршрут (второй и третий маршрут должны быть связаны?):

routes.MapRoute(
    "SchoolRoute",
    "{controller}/{action}/{SchoolID}/{ReviewID}/{CategoryID}",
    new { controller = "School", action = "Edit", CategoryID = "1" }
);

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

2 голосов
/ 24 июля 2010

Вам нужно поставить свои собственные маршруты выше маршрута по умолчанию action / controller / id.Перечислите их в порядке, обратном тому, что есть у вас.

...