Почему 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" })