Почему Html.ActionLink визуализирует "Длина = 4"

Я ОЧЕНЬ смущен, почему этот код

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

приводит к этой ссылке:

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

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

Ответ 1

Длина = 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" })

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

EDIT: просто перечитайте сообщение и поняли, что скорее всего хотите указать нуль как второй последний параметр, а не последний.

Ответ 5

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

Это приведет к перегрузке: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes

Ответ 6

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

@using (@Ajax.BeginForm("Register", "Account", null,
    new AjaxOptions
    {
        HttpMethod = "POST",
        OnSuccess = "OnSuccess",
        OnFailure = "OnFailure",
        OnBegin = "OnBegin",
        OnComplete = "OnComplete"
    }, new { @class = "form-login" }))

Ответ 7

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

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

Ответ 8

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

 @Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null)

Ответ 9

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

Html.BeginForm()

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

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

который добавлял в форму форму при рендеризации строки "? Length = 6" . Подтвержденный одобренным roryf ответом и реализация длины строки "Create" равна 6, я, наконец, решил это, исключив спецификацию явного действия:

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

Ответ 10

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

@Html.ActionLink("About", "About", new { controller = "Home", area = "" }, new { hidefocus = "hidefocus", @class = "nav-item nav-link" })