@ Html.ActionLink помощник, указывающий на текущую страницу

Настраивать:

Я использую помощник Html.ActionLink для создания тегов своего действия Reset в контроллере PasswordReset в области Admin.

Вызовы Html.ActionLink (EDITED, но все равно без радости):

Вызов Html.ActionLink выполняется в цикле foreach (упрощенный html):

foreach(var item in Model.Entities)
{
   <p>
      @Html.ActionLink("Reset Password", 
          "Reset",
          "PasswordReset", 
          new {area="Admin", 
               userName=item.UserName, 
               email=item.Email, 
               roles=item.Roles},
          null)
   </p>
}

Мое действие:

[HttpGet]
        public virtual ActionResult Reset(string userName, string email, string roles)
        {
            if (string.IsNullOrEmpty(userName)) throw new ApplicationException("Invalid Username!");
            var ue = new UsernameEmailDTO
            {
                UserName = userName,
                Email = email,
                Roles = roles
            };
            return View(ue);
        }

Маршрут:

context.MapRoute(
            "Admin_PasswordReset",
            "Admin/Password/Reset/{userName}",
            new { controller = "PasswordReset", action="Reset", email = UrlParameter.Optional, roles = UrlParameter.Optional }
        );

Проблема:

Я могу вызвать действие напрямую, используя маршрут.

Однако моя ссылка действия просто создает ссылку, указывающую на текущую страницу.

Значит, в моем коде Html.ActionLink должна быть ошибка.

Но что?!

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


person awrigley    schedule 11.04.2013    source источник
comment
Стрельба от бедра, но попробуйте переместить свойство контроллера из routeValues ​​в его собственный параметр помощника ActionLink.   -  person Moby's Stunt Double    schedule 11.04.2013
comment
@ Moby'sStuntDouble: Нет, тоже не работает. Однако я внес поправку в вопрос, указав ваше предложение.   -  person awrigley    schedule 11.04.2013
comment
Не могли бы вы опубликовать ссылку, созданную Html.ActionLink?   -  person Fals    schedule 11.04.2013
comment
Как указано в вопросе, он просто создает ссылку, указывающую на текущую страницу. Нет смысла публиковать это.   -  person awrigley    schedule 11.04.2013
comment
Ну просто пытаюсь тебе помочь! Может, что-то напортачило с настройкой Областей! Может быть, Html.RouteLink решит проблему. Взгляните сюда! stackoverflow.com/questions/5432185/   -  person Fals    schedule 11.04.2013
comment
Спасибо за ваши усилия, Фальс. Извините, если я поспешил за то, что вы угадали. Я называю это днем.   -  person awrigley    schedule 11.04.2013
comment
Вы пробовали Route Debugger от Haack? haacked.com/archive/2008/03/13/url- routing-debugger.aspx   -  person Moby's Stunt Double    schedule 12.04.2013


Ответы (1)


Помощник заменяет ваш URL-адрес текущим путем маршрута. Передайте routeValues: null в качестве параметра, чтобы решить эту проблему.

foreach(var item in Model.Entities)
{
    <p>
     @Html.ActionLink("Reset Password", "Reset", "PasswordReset", 
     new {
            userName = item.UserName,
            email = item.Email,
        roles = item.Roles }
    )
    </p>
}

РЕДАКТИРОВАТЬ: теперь я это вижу. Проблема в конфигурации вашего маршрута. Вы передаете 3 параметра, но ваши маршруты принимают только один. Когда помощник Html создает маршрут, он выбирает первый совпадающий маршрут.

context.MapRoute(
        "Admin_PasswordReset",
        "Admin/Password/Reset/{userName}/{email}/{roles}",
        new { controller = "PasswordReset", action="Reset", email = UrlParameter.Optional, roles = UrlParameter.Optional }
    );

Нашел здесь: Проблема с маршрутом Html ActionLink

person Fals    schedule 11.04.2013
comment
вы не можете установить для routeValues ​​значение null - мне это нужно! Вы имели в виду htmlAttributes = null? Кроме того, как написано, ваш код выдает ошибку: именованные параметры не могут предшествовать позиционным. - person awrigley; 11.04.2013
comment
Я провел небольшое исследование, попробовал это и дайте мне знать! :) - person Fals; 11.04.2013
comment
нет причин для его работы, если мой маршрут не работает: два других параметра являются необязательными. Как в UrlParameter.Optional. Я попробовал, и, как и ожидалось, не работает. - person awrigley; 11.04.2013