web-dev-qa-db-fra.com

Utilisation de Html.BeginForm avec querystring

Mon URL ressemble à ceci:

customer/login?ReturnUrl=home

Dans la vue de connexion, j'ai utilisé ce modèle de code qui fonctionne bien.

@using(Html.BeginForm())
{
   ...
}

Cela génère comme par magie html suivant

<form action="customer/login?ReturnUrl=home" method="post">

Mais maintenant, je dois ajouter un attribut (par exemple, data-id="something") sous la forme. Comment puis je faire ça? Si je n'ai pas de chaîne de requête, je sais que je peux faire quelque chose comme ceci:

@using(Html.BeginForm(action, controller, FormMethod.Post, 
                      new { data_id="something" }))

Mais je ne sais pas comment ajouter une chaîne de requête qui devrait être en html:

<form action="customer/login?ReturnUrl=home" method="post" data-id="something">

J'ai pensé à utiliser <form> directement mais je ne sais pas comment spécifier la chaîne de requête qui est variable. Et je ne sais pas comment y parvenir avec Html.BeginForm. Tout conseil serait apprécié.

RÉSOLUTION:

Pour l'instant, j'ai utilisé <form> avec l'indice suivant Comment obtenir la valeur d'URL actuelle dans View . La vue résultante ressemble à

<form action="@Request.Url.PathAndQuery" data-id="something" method="POST">

Mais ce serait bien d'avoir une méthode surchargée de BeginForm pour cela.

30
Tae-Sung Shin

Je suppose que cela ne répond pas directement à la question, mais pourquoi ne pas simplement utiliser une ancienne balise de formulaire ordinaire?

 <form action='customer/[email protected]["ReturnUrl"]' method="post" data-id="something">

Alternativement, vous pouvez créer un HtmlHelperExtension personnalisé qui rend un formulaire avec chemin et chaîne de requête. Dans cette HtmlHelperExtension, vous pouvez parcourir les valeurs de votre chaîne de requête et remplir le routeValueDictionary que vous passez ensuite à un constructeur Html.BeginForm.

Si vous ne voulez pas quelque chose d'aussi extensible, vous pouvez simplement utiliser le constructeur surchargé de Html.BeginForm en utilisant @Html.BeginForm("login", "customer", new {ReturnUrl = @Request.QueryString["ReturnUrl"]},FormMethod.Post, new {data-id="something"});

16
arviman

Voici la façon dont cela a fonctionné pour moi

Html.BeginForm("Profile", "Partner", routeValues: new {id=Partner.partner_id},method:FormMethod.Post)

C'était presque comme s'il y avait un problème avec la surcharge de la méthode, mais en spécifiant ce que sont les choses, cela semble bien fonctionner ...

19
JustMaier

Pour créer un RouteValueDictionary à partir de la chaîne de requête:

RouteValueDictionary queryStringDictionary = new RouteValueDictionary(Request.QueryString.AllKeys.ToDictionary(key => key, key => (object)Request.QueryString[key]));

Ensuite, vous pouvez l'utiliser avec Html.BeginForm:

Html.BeginForm(null, null, queryStringDictionary, FormMethod.Post, new Dictionary<string, object> { { "autocomplete", "off" } })
17
conical

en utilisant Reflector pour regarder le code,

BeginForm () passera directement le rawUrl au formulaire final. Toute autre surcharge sur BeginForm passera par un utilitaire d'assistance qui supprimera la chaîne de requête.

3
savagepanda

Essayez @using(Html.BeginForm(null, null, FormMethod.Post, new { data_id="something" }))

Il doit utiliser la logique par défaut pour construire l'url, comme si vous utilisiez BeginForm()

(je n'ai jamais essayé cela dans un tel cas, mais je pense que cela devrait fonctionner)

0
Michael Sagalovich

Cela fonctionne pour moi:

@using (Html.BeginForm("index", "Photos", routeValues: new { user = pUser, album = pAlbum, }, method: FormMethod.Get))

Des valeurs et une méthode explicites de l'itinéraire sont nécessaires ...

0
Sanjeev

Au cas où vous souhaiteriez également ajouter d'autres attributs. utiliser le code ci-dessous

@using (Html.BeginForm("actionName", "controllerName", routeValues: new { lang = "en" }, method:FormMethod.Post, htmlAttributes: new { @class= "my-form", enctype = "multipart/form-data" }))
0
Saad A