Устранение неполадок маршрутизации в ASP.NET MVC 3 - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть область, которая зарегистрирована как:

public override void RegisterArea(AreaRegistrationContext context) {
    context.MapRoute("CPanel_default",
        "CPanel/{controller}/{action}/{id}/{*urlData}",
        new { id = UrlParameter.Optional, urlData = UrlParameter.Optional });
}

Этот маршрут предназначен для полного количества URL-адресов:

  • / cpanel / home / index
  • / cpanel / entity / edit / 20
  • / cpanel / entity / edit / 20 / abitrary-url-data

Отладчик маршрута Haack показал мне, что маршрутфункционируя в этом качестве.Тем не менее, мой код для создания ссылок действий недавно сломался, и я не смог выяснить причину прерывания.

Создаются ссылки действий со следующим кодом:

public static MvcHtmlString CpanelLink(this HtmlHelper @this, string linkText, 
    string actionName, string controllerName, string areaName = "CPanel") {

    return @this.ActionLink(linkText, 
        actionName, new { controller = controllerName, area = areaName });
}

Который, насколько я могу судить, должен учитывать все обязательные поля в области маршрута.Отладка показывает, что CpanelLink возвращает <a href="">...</a>, ссылку на ничто.

Редактировать

Дополнительное устранение неполадок обнаружило, что параметр маршрута {* urlData} убивает Html.CpanelLink.Сокращение маршрута до «CPanel / {controller} / {id}» устраняет проблему, но прерывает URL-адреса, которые зависят от параметра urlData.

1 Ответ

2 голосов
/ 12 сентября 2011

Проблема в том, что вы не можете передать имя контроллера в качестве параметра маршрута.

Вам необходимо использовать следующую сигнатуру метода ActionLink ()

return @this.ActionLink(linkText, actionName, controllerName, new { area = areaName }, null);

Обратите внимание на последний параметрзначение равно 'null', что представляет атрибуты html.

ОБНОВЛЕНИЕ:

Другая проблема заключается в последовательных необязательных параметрах, как описано в статье Фила Хаака сообщение в блоге

Таким образом, вы должны сделать обходной путь как таковой;

 context.MapRoute(
                "Route_withUrl",
                "CPanel/{controller}/{action}/{id}/{urlData}",
                new { controller = "Home", action = "Index" }
            );

            context.MapRoute(
                "Cpanel_default",
                "CPanel/{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional}
            );
...