Почему Html.ActionLink отображает "? Length = 4" - PullRequest
298 голосов
/ 05 мая 2009

Я ОЧЕНЬ не понимаю, почему этот код

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })

результатов по этой ссылке:

<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>

Часть hidefocus - это то, к чему я стремился, но откуда взялся ?Length=4?

Ответы [ 10 ]

315 голосов
/ 05 мая 2009

Длина = 4 происходит от попытки сериализации строкового объекта. Ваш код использует этот ActionLink метод:

public static string ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes)

Это принимает string объект «Домой» для routeValues, который MVC ищет в открытых свойствах, превращая их в значения маршрута. В случае объекта string единственным открытым свойством является Length, и поскольку не будет определено ни одного маршрута с параметром Length, он добавляет имя и значение свойства в качестве параметра строки запроса. Вы, вероятно, обнаружите, что если вы запустите это со страницы не на HomeController, это выдаст ошибку об отсутствующем методе действия About. Попробуйте использовать следующее:

Html.ActionLink("About", "About", new { controller = "Home" }, new { hidefocus = "hidefocus" })
187 голосов
/ 02 ноября 2010

Я решил это путем добавления нулевого значения к четвертому параметру перед анонимным объявлением (new {}), чтобы он использовал следующую перегрузку метода: (linkText, actionName, controllerName, routeValues, htmlAttributes):

Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" })
87 голосов
/ 27 мая 2012

Вы забыли добавить параметр HTMLAttributes.

Это будет работать без изменений:

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)
27 голосов
/ 05 мая 2009

Параметры ActionLink неверны, он пытается использовать значение «Home» в качестве значения маршрута вместо анонимного типа.

Полагаю, вам просто нужно добавить new { } или null в качестве последнего параметра.

РЕДАКТИРОВАТЬ: Просто перечитайте пост и поняли, что вы, вероятно, захотите указать ноль в качестве второго последнего параметра, а не последний.

5 голосов
/ 15 июня 2014
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { })

Это примет перегрузку: строка linkText, строка actionName, строка controllerName, объект routeValues, объект htmlAttributes

3 голосов
/ 08 декабря 2015

Пожалуйста, используйте правильный перегруженный метод с пятью (5) параметрами. Пример:

@using (@Ajax.BeginForm("Register", "Account", null,
    new AjaxOptions
    {
        HttpMethod = "POST",
        OnSuccess = "OnSuccess",
        OnFailure = "OnFailure",
        OnBegin = "OnBegin",
        OnComplete = "OnComplete"
    }, new { @class = "form-login" }))
2 голосов
/ 10 мая 2012

Просто удалите «Home» (имя контроллера), чтобы код был:

Html.ActionLink("About", "About", new { hidefocus = "hidefocus" })
1 голос
/ 19 мая 2015

С именами атрибутов:

 @Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null)
0 голосов
/ 09 августа 2018

Возможно, у других была такая же проблема, и им необходимо предоставить значение class через HTMLAttributes parm. Вот мое решение:

@Html.ActionLink("About", "About", new { controller = "Home", area = "" }, new { hidefocus = "hidefocus", @class = "nav-item nav-link" })
0 голосов
/ 25 ноября 2013

Как отметил Джонатон Уотни в комментарии, это также относится к

Html.BeginForm ()

методы. В моем случае я находился в Create.cshtml , предназначенном для запроса на публикацию соответствующего контроллера + действие Create, и имел

using (Html.BeginForm("Create")) {
  @Html.AntiForgeryToken()
  ...
}

который добавлял строку запроса "? Length = 6" к действию формы при визуализации. Намекнув на одобренный ответ Рорифа и понимая, что длина строки «Создать» равна 6, я наконец решил эту проблему, удалив явную спецификацию действия:

using (Html.BeginForm()) {
      @Html.AntiForgeryToken()
      ...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...