Маршрутизация в MVC не работает - PullRequest
2 голосов
/ 19 января 2012

У меня есть следующий маршрут:

routes.MapRoute(
    "Property",
    "{language}/property/{propertyUrlId}",
    new { controller = "PropertyDetails", action = "Property" }

Это контроллер, который должен вызываться для этого маршрута:

public class PropertyDetailsController : Controller
{
    public ActionResult Property(string language, string propertyUrlId)
    {

и т. Д.

и следующееURL, который должен использовать этот маршрут:

http://domain.com/en-us/property/3

Вместо этого я получаю 404. Есть идеи почему?


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

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapRoute(
        "Property",
        "property/{propertyUrlId}",
        //new { controller = "PropertyDetails", action = "Property" }, new { language = @"[a-zA-Z]{2}-[a-zA-Z]{2}" }
        new { controller = "PropertyDetails", action = "Property" }
    );
}

Didnне работает с языком или с языком / страной, либо

Ответы [ 4 ]

2 голосов
/ 19 января 2012

Скорее всего, вы зарегистрировали маршрут по умолчанию до вашего маршрута собственности.Маршрут по умолчанию обычно выглядит следующим образом:

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

Просто зарегистрируйте свой маршрут собственности ДО этого маршрута по умолчанию, и он будет работать.

Почему не получается? (Предположим,действительно сначала регистрируется маршрут по умолчанию)

en-us -> интерпретируется как свойство контроллера

-> интерпретируется как действие

Поскольку у вас нет en-usControllerс действием свойства -> 404

2 голосов
/ 19 января 2012

Использовать «en-us» в качестве сегмента URL вполне нормально. Я предполагаю, что вы зарегистрировали и другие маршруты. Попробуйте вывести этот маршрут на вершину других и хотя бы на вершину маршрута по умолчанию.

Я проверил сценарий, он прекрасно работает для меня.

0 голосов
/ 24 января 2012

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

routes.MapRoute(
    "Property",
    "{language}/property/{propertyUrlId}",
    new { controller = "PropertyDetails", action = "Property" }

Во-вторых, я пропустил некоторую информацию, которая имела решающее значение для решения этой проблемы. Мне не пришло в голову включить это в описание моей проблемы, так как я не знал, что есть какие-то отношения. Проект MVC находится в решении, которое также содержит веб-сайт (не MVC), который использует CMS Sitecore в качестве хранилища данных. Sitecore убирает языковой сегмент URL и сам сохраняет его. Узнав, что это происходит, я смог разобраться с проблемой.

Я ценю все комментарии и прошу прощения за путаницу.

0 голосов
/ 21 января 2012

Учитывая, что вы хотите, чтобы структура URL была:

http://domain.com/en-us/property/3

используйте эту маршрутизацию:

routes.MapRoute(
            "Property", // Route name
            "{language}/property/{propertyUrlId}", // URL with parameters
            new { controller = "PropertyDetails", action = "Property", propertyUrlId = UrlParameter.Optional } // Parameter defaults
        );

если в вашем файле Global.asax есть маршрутизация по умолчанию, например:

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

Поместите рутину над этим блоком кода.

И ваше действие контроллера должно выглядеть так:

public ActionResult Property(int propertyUrlId)
{
 return View();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...