Я ОЧЕНЬ не понимаю, почему этот код
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })
результаты в этой ссылке:
<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>
Это hidefocus
то, чего я стремился достичь, но откуда это ?Length=4
взялось?
asp.net-mvc
Мое Альтер Эго
источник
источник
Ответы:
Длина = 4 происходит от попытки сериализации строкового объекта. Ваш код выполняет этот
ActionLink
метод:Это берет
string
объект "Home" для routeValues, который MVC ищет в открытых свойствах, превращая их в значения маршрута. В случаеstring
объекта единственным общедоступным свойством являетсяLength
, и поскольку не будет определено ни одного маршрута с параметром Length, он добавляет имя и значение свойства в качестве параметра строки запроса. Вы, вероятно, обнаружите, что если вы запустите это со страницы, которой нет, выHomeController
увидите ошибку о пропущенномAbout
методе действия. Попробуйте использовать следующее:источник
Url.Action()
. Изменение сUrl.Action("Action", "Controller", new { area = "" })
на неUrl.Action("Action", new { controller = "Controller", area = "" })
позволяет показывать свойство Length.Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
Я решил это путем добавления нулевого значения к четвертому параметру перед анонимным объявлением (
new {}
), чтобы он использовал следующую перегрузку метода: (linkText, actionName, controllerName, routeValues, htmlAttributes):источник
controller
и,area
чтобы свойство Length не отображалось в URL.routeValues
а только область. Например:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
ActionLink
, MVC будет включать странныйLength=x
параметр в конце URL-адреса. Например, поместите это на страницу, затем просмотрите источник своей страницы, и вы поймете, что я имею в виду:@Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" })
@Html.ActionLink("About", "About", "Home", new { area = "Admin" })
Но если вы поместитеcontroller
запись вrouteValues
, она никогда не будет вставленаLength=x
в URL.@
в@area = "Admin"
, только так вы знаете.Вы забыли добавить параметр HTMLAttributes.
Это будет работать без каких-либо изменений:
источник
Параметры ActionLink неверны, он пытается использовать значение «Home» в качестве значения маршрута вместо анонимного типа.
Я считаю, что вам просто нужно добавить
new { }
илиnull
в качестве последнего параметра.РЕДАКТИРОВАТЬ: Просто перечитайте пост и понял, что вы, вероятно, захотите указать ноль в качестве второго последнего параметра, а не последний.
источник
Это займет перегрузку: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes
источник
Пожалуйста, используйте правильный перегруженный метод с пятью (5) параметрами. Пример:
источник
Просто удалите «Home» (имя контроллера), чтобы код был:
источник
С именами атрибутов:
источник
Как отметил в комментарии Джонатон Уотни, это также относится и к
методы. В моем случае я находился в Create.cshtml, предназначенном для запроса на публикацию соответствующего контроллера + действие Create, и имел
который добавлял строку запроса "? Length = 6" к действию формы при визуализации. Намекнув на одобренный ответ Рорифа и понимая, что длина строки «Создать» равна 6, я наконец решил эту проблему, удалив явную спецификацию действий:
источник
Возможно, у других была такая же проблема, и они должны указывать значение класса через HTMLAttributes parm . Вот мое решение:
источник
Поиск ответа на мой вопрос привел меня сюда, в основном это выбор правильной перегрузки,
@Html.ActionLink
которая имеет значение.Я отбирал перегрузку , которая не существует, ( без последней
null
), иMVC
не было такой перегрузки, в результате ложного URL что - то вроде ОП упоминается.Личное примечание: вы можете использовать
use
анонимные типы, это не значит, что вы можете использовать какие-либо из перегрузок, которых не существует? - убедитесь , что: он должен быть определен!- Пришел сюда во времена MVC 5.2
источник