LogOnPartial рендерится с пустой ссылкой - MVC 3 - PullRequest
2 голосов
/ 19 апреля 2011

Я использую стандартный веб-проект MVC 3 и записал свой HTML-код в стандартный файл HTML, а затем скопировал / вставил его в файл _layout.cshtml. Со всеми правильными RenderBody () и @ Html.Partial ("_ LogOnPartial") страница работает нормально, но ActionLink внутри _LogOnPartial не отображает href.

Html.ActionLink("Log On", "LogOn", "Account")

выйдет как:

<a href="">Log On</a>

Это не отличается от стандартной ссылки, которую вы получаете при запуске веб-проекта MVC 3.

Зарегистрированные маршруты:

 public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

        routes.MapRoute(
            "Products",
            "{controller}/{action}/{id}",
            new {controller = "Products", action = "Index"});

        routes.MapRoute(
        "Newsletter",
        "{controller}/{action}/{emailAddress}",
        new { controller = "Newsletter", action = "Index" });

        routes.MapRoute(
       "Account",
       "{controller}/{action}/{id}",
       new { controller = "Account", action = "LogOn", id = UrlParameter.Optional });

    }

Я не понимаю, почему это происходит, но в Visual Studio это не подчеркивает действие или контроллер, что заставляет меня думать, что он не видит AccountController должным образом. У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 11 мая 2011

Фабиан прав.Проблема в том, что существует слишком много маршрутов, многие из которых почти идентичны по своей схеме.Ваши маршруты «Default», «Products» и «Account» - все ищут контроллер, действие и необязательный идентификатор (явно или неявно).Вы, вероятно, добились бы значительно большего успеха, если бы вы просто вернули контроллер по умолчанию в его заводскую стандартную форму, например, так:

    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


        routes.MapRoute(
        "Newsletter",
        "{controller}/{action}/{emailAddress}",
        new { controller = "Newsletter", action = "Index" });

    }

Поскольку идентификатор является необязательным, маршруты ваших продуктов по-прежнему будут совпадать, если вы предоставитеActionLink без идентификатора (например, @Html.ActionLink("My Link", "Products", "Index")) и форма маршрута «Учетная запись» в любом случае идентична форме «По умолчанию».Нет необходимости использовать его, и между ними, вероятно, возникает MVC, что приводит к сбою Href вашего частичного LogOn.

0 голосов
/ 20 апреля 2011

ActionLink не смотрит на контроллер или его действия, а только на таблицу маршрутизации.Убедитесь, что у вас есть маршрут с действием «LogOn» и контроллером «Account», установленным в вашем global.asax.

Редактировать: Я рекомендую вам немного прочитать о маршрутизации MVC.Ваши текущие маршруты слишком жадные и будут совпадать, когда они не должны.

Для входа в систему я бы использовал что-то вроде этого (поместите его сверху, потому что он наименее жадный, поскольку не содержит никаких переменных):

routes.MapRoute(
       "Account",
       "logon",
       new { controller = "Account", action = "LogOn", id = UrlParameter.Optional });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...