asp.net mvc - mvc - Usando Html.BeginForm con cadena de consulta
html beginform attributes (7)
Mi url se ve así:
customer/login?ReturnUrl=home
En la vista de inicio de sesión, he usado este patrón de código que funciona bien.
@using(Html.BeginForm())
{
...
}
Esto genera mágicamente siguiente html
<form action="customer/login?ReturnUrl=home" method="post">
Pero ahora, necesito agregar un atributo (por ejemplo, data-id="something"
) en el formulario. ¿Cómo puedo hacer eso? Si no tengo ninguna cadena de consulta, sé que puedo hacer algo como esto:
@using(Html.BeginForm(action, controller, FormMethod.Post,
new { data_id="something" }))
Pero no sé cómo agregar una cadena de consulta que debería estar en html:
<form action="customer/login?ReturnUrl=home" method="post" data-id="something">
Pensé en usar <form>
directamente, pero no sé cómo especificar la cadena de consulta que es variable. Y no tengo idea de cómo lograrlo con Html.BeginForm
. Cualquier consejo sería apreciado.
RESOLUCIÓN:
Por ahora, utilicé <form>
con la siguiente sugerencia Cómo obtener el valor de la URL actual en Vista . La vista resultante se ve como
<form action="@Request.Url.PathAndQuery" data-id="something" method="POST">
Pero sería bueno tener un método sobrecargado de BeginForm
para esto.
Aquí está la forma en que funcionó para mí
Html.BeginForm("Profile", "Partner", routeValues: new {id=Partner.partner_id},method:FormMethod.Post)
Era casi como si hubiera un problema con la sobrecarga del método, pero al especificar qué son las cosas, parece funcionar bien ...
Esto funciona para mí:
@using (Html.BeginForm("index", "Photos", routeValues: new { user = pUser, album = pAlbum, }, method: FormMethod.Get))
Lo que se requiere es un método y valores de ruta explícitos ...
Para crear un RouteValueDictionary desde la cadena de consulta:
RouteValueDictionary queryStringDictionary = new RouteValueDictionary(Request.QueryString.AllKeys.ToDictionary(key => key, key => (object)Request.QueryString[key]));
Entonces puedes usarlo con Html.BeginForm:
Html.BeginForm(null, null, queryStringDictionary, FormMethod.Post, new Dictionary<string, object> { { "autocomplete", "off" } })
Probar @using(Html.BeginForm(null, null, FormMethod.Post, new { data_id="something" }))
Debería usar la lógica predeterminada para construir la url, como si usara BeginForm()
(Nunca lo intenté aunque en tal caso, pero creo que debería funcionar)
Solo en caso de que quisieras agregar otros atributos también. usar el código de abajo
@using (Html.BeginForm("actionName", "controllerName", routeValues: new { lang = "en" }, method:FormMethod.Post, htmlAttributes: new { @class= "my-form", enctype = "multipart/form-data" }))
Supongo que esto no responde directamente a la pregunta, pero ¿por qué no usar simplemente una etiqueta de formulario antigua?
<form action=''customer/[email protected]["ReturnUrl"]'' method="post" data-id="something">
Alternativamente, puede crear una HtmlHelperExtension personalizada que represente un formulario con ruta y cadena de consulta. En este HtmlHelperExtension puede recorrer sus valores de cadena de consulta y rellenar el routeValueDictionary que luego pasa a un constructor Html.BeginForm.
Si no quieres algo tan extensible, puedes usar el constructor sobrecargado de Html.BeginForm usando @Html.BeginForm("login", "customer", new {ReturnUrl = @Request.QueryString["ReturnUrl"]},FormMethod.Post, new {data-id="something"});
usando Reflector para mirar el código,
BeginForm () pasará directamente el rawUrl a la forma final. Cualquier otra sobrecarga en BeginForm pasará por una utilidad auxiliar que eliminará la cadena de consulta.