¿Cómo consigo los valores de cadena de consulta en un RouteValueDictionary el uso de Html.BeginForm ()?
-
10-10-2019 - |
Pregunta
he encontrado que Html.BeginForm()
rellena automáticamente el RouteValueDictionary con el RawUrl (es decir. QueryStringParamters). Sin embargo tengo que especificar un HtmlAttribute así que tengo que usar la anulación ...
public static MvcForm BeginForm(this HtmlHelper htmlHelper, string actionName, string controllerName, FormMethod method, object htmlAttributes)
Cuando hago los valores de cadena de consulta se NO añade automáticamente a la RouteValueDictionary. ¿Cómo puedo lograr esto?
Aquí está mi mejor intento pero no parece estar funcionando.
<% RouteValueDictionary routeValueDictionary = new RouteValueDictionary(ViewContext.RouteData.Values);
foreach (string key in Request.QueryString.Keys )
{
routeValueDictionary[key] = Request.QueryString[key].ToString();
}
using (Html.BeginForm("Login", "Membership", routeValueDictionary, FormMethod.Post, new { @class = "signin-form" }))
{%> ...
Mi Acción controlador se parece a esto ...
[HttpPost]
public ActionResult Login(Login member, string returnUrl)
{ ...
Sin embargo, el valor de "ReturnURL", que es parte de la cadena de consulta siempre es NULL a menos que utilice el valor por defecto sin parámetros Html.BeginForm () en mi opinión.
Gracias, Justin
Solución
Se puede escribir un ayudante:
public static MvcHtmlString QueryAsHiddenFields(this HtmlHelper htmlHelper)
{
var result = new StringBuilder();
var query = htmlHelper.ViewContext.HttpContext.Request.QueryString;
foreach (string key in query.Keys)
{
result.Append(htmlHelper.Hidden(key, query[key]).ToHtmlString());
}
return MvcHtmlString.Create(result.ToString());
}
y, a continuación:
<% using (Html.BeginForm("Login", "Membership", null, FormMethod.Post, new { @class = "signin-form" })) { %>
<%= Html.QueryAsHiddenFields() %>
<% } %>
Otros consejos
Inspección del código fuente para Html.BeginForm()
en http : //aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Html/FormExtensions.cs no ayuda demasiado, pero se nota la razón por el método sin parámetros hace lo que quiere - -. que es, literalmente, el establecimiento de formAction
de la solicitud de URL
Si prefieres que la cadena de consulta permanecerá como la cadena de consulta, en lugar de ser potencialmente parte de un POST, aquí es una extensión alternativa:
/// <summary>
/// Turn the current request's querystring into the appropriate param for <code>Html.BeginForm</code> or <code>Html.ActionLink</code>
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
/// <remarks>
/// See discussions:
/// * http://stackoverflow.com/questions/4675616/how-do-i-get-the-querystring-values-into-a-the-routevaluedictionary-using-html-b
/// * http://stackoverflow.com/questions/6165700/add-query-string-as-route-value-dictionary-to-actionlink
/// </remarks>
public static RouteValueDictionary QueryStringAsRouteValueDictionary(this HtmlHelper html)
{
// shorthand
var qs = html.ViewContext.RequestContext.HttpContext.Request.QueryString;
// because LINQ is the (old) new black
return qs.AllKeys.Aggregate(new RouteValueDictionary(html.ViewContext.RouteData.Values),
(rvd, k) => {
// can't separately add multiple values `?foo=1&foo=2` to dictionary, they'll be combined as `foo=1,2`
//qs.GetValues(k).ForEach(v => rvd.Add(k, v));
rvd.Add(k, qs[k]);
return rvd;
});
}