¿Cómo consigo los valores de cadena de consulta en un RouteValueDictionary el uso de Html.BeginForm ()?

StackOverflow https://stackoverflow.com/questions/4675616

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

¿Fue útil?

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;
        });
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top