Rounting в областях asp mvc - проблема с большим количеством областей - PullRequest
1 голос
/ 11 января 2012

Маршрутизация сводит меня с ума твои дни :( У меня есть две области: CityPage и Job На странице города у меня есть список ссылок, которые ведут в область Работа. Это код для действий и маршрутизации для CityPage:

public ActionResult Index(string city, string countryCode)
        {
            return View();
        }

In CityPageAreaRegistration.cs class:
context.MapRoute(
                null,
                "CityPage/{countryCode}/{city}",
                new { area = "CityPage", controller = "Home", action = "Index", city = "" }
            );

URL, который я здесь получаю, в порядке

http://localhost/CityPage/UK/London

Из индекса CityPage я могу перейти к списку вакансий (Job/Home/Index)

@Html.ActionLink("Jobs", "Index", "Home", new { area = "Job" }, null)

Это код из области вакансий:

public ActionResult Index()
        {
            return View();
        }
context.MapRoute(
                null,
                "{area}/{countryCode}/{city}/Job/{controller}/{action}",
                new { area = "Job", controller = "Home", action = "Index",
                      countryCode = "UK",
                      city = "London"
                }
            );

URL, который я здесь получаю, все еще в порядке

http://localhost/CityPage/UK/London/Job

Но на этой странице у меня есть ссылка на информацию о работе (Job/Home/Show)

@Html.ActionLink("Job Example", "Show", "Home", new { area = "Job", jobId = 8765 }, null)

И URL, который я получаю, это

http://localhost/CityPage/UK/London/Job/Home/Show?jobId=8765

I have tried to add routing like this

            context.MapRoute(
                "Jobs",
                "{area}/Job/{jobId}",
                new
                {
                    area = "Job",
                    controller = "Home",
                    action = "Index",
                    countryCode = "RS",
                    city = "Kragujevac",
                    jobId = ""
                }
            );

Но это не работает. Я не знаю, что я делаю не так :( URL, который я пытаюсь получить, похож на

http://localhost/CityPage/UK/London/Job/8765

Я все еще учусь о маршрутизации. Но области заставляют меня ...
Я не добавляю никакой маршрутизации в Global.asax. Я думаю, что мне нужно написать код маршрутизации в областях классов routing.cs, я прав?

Ответы [ 2 ]

1 голос
/ 11 января 2012

Я следил за твоим сумасшествием.Я хотел бы предложить вам попробовать что-то под названием T4MVC.Он доступен в виде пакета NuGet, и я думаю, что теперь он является частью MvcContrib.

Я большой поклонник T4MVC.Это делает маршрутизацию URL-адресов к методам действий НАМНОГО проще и избавляет от множества волшебных строк.

Вот пример определения маршрута в «Общей» области нашего приложения:

context.MapRoutes(null,
    new[] { string.Empty, "features", "features/{version}" },
    new
    {
        area = MVC.Common.Name,
        controller = MVC.Common.Features.Name,
        action = MVC.Common.Features.ActionNames.ForPreview,
        version = "december-2011-preview-2",
    },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

Обратите внимание, что нет волшебных строк для имен областей, контроллеров или действий.Все эти вещи строго типизированы T4MVC.Самая большая часть заключается в следующем: посмотрите, как мы можем сгенерировать ссылку на эти страницы:

@Html.ActionLink("December 2011 Preview 2 features", 
    MVC.Common.Features.ForPreview())
@Html.ActionLink("December 2011 Preview 1 features", 
    MVC.Common.Features.ForPreview("december-2011-preview-1"))

Существуют некоторые перегрузки ActionLink, которые принимают параметр ActionResult.T4MVC предоставляет вам строго типизированный метод ActionResult, который вы можете использовать в этой перегрузке.Параметры, передаваемые в метод, будут сопоставляться с вашими определениями маршрутов.

Когда я кодирую маршруты и методы действий, я беспокоюсь только о том, что имена параметров URL в моем маршруте соответствуют аргументам метода действия, которым они являются.сопоставлены с.Итак, вот подпись метода ForPreview на FeaturesController:

public virtual ActionResult ForPreview(
    string version = "december-2011-preview-2")

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

Обновление

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

public static void MapRoutes(this AreaRegistrationContext context,
    string name, IEnumerable<string> urls, object defaults, 
    object constraints = null)
{
    foreach (var url in urls)
        context.MapRoute(name, url, defaults, constraints);
}
1 голос
/ 11 января 2012

Похоже, вы были довольно близко.

Я создал маршрут, подобный этому:

context.MapRoute(
            "Job_Locator",
            "{countryCode}/{city}/Job/{jobId}",
            new
            {
                area = "Job",
                controller = "Home",
                action = "Show"
            }
        );

А затем ссылка на действие, подобная этой:

@Html.ActionLink("Test", "Index", "Home", new { Area = "Job", countryCode = "UK", city = "London", jobId = 10 }, null)

Где действие:

public ActionResult Index(string city, string countryCode, int jobId)
{
    return View();
}

Имейте в виду, что я создал новую область под названием "Работа", и у меня есть HomeController с действием Index

...