asp.net mvc - net - ¿Por qué Html.ActionLink muestra "? Longitud=4"
libro asp.net mvc 5 español (10)
Como Jonathon Watney señaló en un comentario, esto también se aplica a
Html.BeginForm ()
metodos En mi caso, estaba en un Create.cshtml dirigido a la solicitud posterior del controlador correspondiente + Acción de creación y tenía
using (Html.BeginForm("Create")) {
@Html.AntiForgeryToken()
...
}
que estaba agregando la cadena de consulta "? Length = 6" a la acción del formulario cuando se procesa. Insinuado por la respuesta aprobada de roryf y dándome cuenta de que la longitud de la cadena "Crear" es 6, finalmente lo resolví eliminando la especificación de acción explícita:
using (Html.BeginForm()) {
@Html.AntiForgeryToken()
...
}
Estoy muy confundido en cuanto a por qué este código
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })
resultados en este enlace:
<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>
La parte de hidefocus
es lo que pretendía lograr, pero ¿de dónde proviene ?Length=4
?
Con nombres de atributos:
@Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null)
La Longitud = 4 proviene de un intento de serializar un objeto de cadena. Su código está ejecutando este método ActionLink
:
public static string ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes)
Esto toma un objeto de string
"Inicio" para routeValues, que la plomería MVC busca para las propiedades públicas y las convierte en valores de ruta. En el caso de un objeto de string
, la única propiedad pública es Length
, y dado que no habrá rutas definidas con un parámetro de Longitud, agrega el nombre y el valor de la propiedad como un parámetro de cadena de consulta. Probablemente encontrará que si ejecuta esto desde una página que no está en HomeController
se generará un error sobre un método de acción About
falta. Trate de usar lo siguiente:
Html.ActionLink("About", "About", new { controller = "Home" }, new { hidefocus = "hidefocus" })
La forma en que resolví esto fue agregando un nulo al cuarto parámetro antes de la declaración anónima ( new {}
) para que use la siguiente sobrecarga del método: (linkText, actionName, controllerName, routeValues, htmlAttributes):
Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" })
Los parámetros de ActionLink no son correctos, está intentando usar el valor "Inicio" como un valor de ruta, en lugar del tipo anónimo.
Creo que solo necesita agregar new { }
o null
como el último parámetro.
EDITAR: simplemente vuelva a leer la publicación y se dio cuenta de que probablemente querrá especificar nulo como el último último parámetro, no el último.
Olvidó agregar el atributo HTMLAttributes.
Esto funcionará sin ningún cambio:
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)
Quizás otros tuvieron el mismo problema y necesitan proporcionar un valor de clase a través de HTMLAttributes parm. Aquí está mi solución:
@Html.ActionLink("About", "About", new { controller = "Home", area = "" }, new { hidefocus = "hidefocus", @class = "nav-item nav-link" })
Simplemente elimine "Home" (nombre del controlador) para que el código sea:
Html.ActionLink("About", "About", new { hidefocus = "hidefocus" })
Utilice amablemente el método de sobrecarga correcta con cinco (5) parámetros. Ejemplo:
@using (@Ajax.BeginForm("Register", "Account", null,
new AjaxOptions
{
HttpMethod = "POST",
OnSuccess = "OnSuccess",
OnFailure = "OnFailure",
OnBegin = "OnBegin",
OnComplete = "OnComplete"
}, new { @class = "form-login" }))
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { })
Esto tomará la sobrecarga: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes