web-dev-qa-db-fra.com

Comment récupérer des valeurs de formulaire depuis HTTPPOST, dictionnaire ou?

J'ai un contrôleur MVC qui a cette méthode d'action:

[HttpPost]
public ActionResult SubmitAction()
{
     // Get Post Params Here
 ... return something ...
}

Le formulaire est un formulaire non trivial avec une simple zone de texte.

Question

Comment accéder aux valeurs de paramètre?

Je ne poste pas à partir d'une vue, la publication est externe. Je suppose qu'il existe une collection de paires clé/valeur auxquelles j'ai accès.

J'ai essayé Request.Params.Get("simpleTextBox"); mais il renvoie l'erreur "Désolé, une erreur s'est produite lors du traitement de votre demande.".

106
Richard

Vous pouvez demander à votre action de contrôleur de prendre un objet qui reflète les noms d’entrée de formulaire et le classeur de modèle par défaut créera automatiquement cet objet pour vous:

[HttpPost]
public ActionResult SubmitAction(SomeModel model)
{
    var value1 = model.SimpleProp1;
    var value2 = model.SimpleProp2;
    var value3 = model.ComplexProp1.SimpleProp1;
    ...

    ... return something ...
}

Une autre façon (évidemment plus laide) est:

[HttpPost]
public ActionResult SubmitAction()
{
    var value1 = Request["SimpleProp1"];
    var value2 = Request["SimpleProp2"];
    var value3 = Request["ComplexProp1.SimpleProp1"];
    ...

    ... return something ...
}
145
Darin Dimitrov

Vous pouvez simplement utiliser FormCollection comme:

[HttpPost] 
public ActionResult SubmitAction(FormCollection collection)
{
     // Get Post Params Here
 string var1 = collection["var1"];
}

Vous pouvez également utiliser une classe mappée avec des valeurs de formulaire et asp.net mvc engine la remplit automatiquement:

//Defined in another file
class MyForm
{
  public string var1 { get; set; }
}

[HttpPost]
public ActionResult SubmitAction(MyForm form)
{      
  string var1 = form1.Var1;
}
100
Adeel

Les réponses sont très bonnes mais il y a un autre moyen que j'aime vraiment utiliser dans la dernière version de MVC et .NET, à la place des clés FormCollection et Request "old school".


Considérons un extrait de code HTML contenu dans une balise de formulaire qui effectue un AJAX ou FORM POST.

<input type="hidden"   name="TrackingID" 
<input type="text"     name="FirstName"  id="firstnametext" />
<input type="checkbox" name="IsLegal"  value="Do you accept terms and conditions?" />

Votre contrôleur analysera les données du formulaire et tentera de vous les transmettre sous forme de paramètres du type défini. J'ai inclus la case à cocher parce que c'est une question délicate. Il retourne le texte "on" si coché et null si non coché. Cependant, l'exigence est que ces variables définies DOIVENT exister (sauf nullable (rappelez-vous que string est nullable)) sinon le retour de AJAX ou POST échouera.

[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
    MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}

Vous pouvez également publier un modèle sans utiliser d’aide au rasoir. Je me suis rendu compte que cela est nécessaire quelques fois.

public Class HomeModel
{
  public int HouseNumber { get; set; }
  public string StreetAddress { get; set; }
}

Le balisage HTML sera simplement ...

<input type="text" name="variableName.HouseNumber" id="whateverid" >

et votre contrôleur (Razor Engine) interceptera la Variable de Forme "nomVariable" (le nom est comme vous voulez mais gardez-la cohérente) et tentera de la construire et de la lancer dans MyModel.

[HttpPost]
public ActionResult PostBack(HomeModel variableName){
    postBack.HouseNumber; //The value user entered
    postBack.StreetAddress; //the default value of NULL.
}

Lorsqu'un contrôleur attend un modèle (dans ce cas, HomeModel), il n'est pas nécessaire de définir TOUS les champs, car l'analyseur les laissera simplement par défaut, généralement NULL. La bonne chose est que vous pouvez mélanger et assortir différents modèles sur le balisage et que l'analyse post-retour sera remplie autant que possible. Vous n'avez pas besoin de définir un modèle sur la page ou d'utiliser des aides.

CONSEIL: le nom du paramètre dans le contrôleur est le nom défini dans le balisage HTML "nom =" et non le nom du modèle, mais le nom de la variable attendue dans le symbole!


Utiliser List<> est un peu plus complexe dans sa majoration.

<input type="text" name="variableNameHere[0].HouseNumber" id="id"           value="0">
<input type="text" name="variableNameHere[1].HouseNumber" id="whateverid-x" value="1">
<input type="text" name="variableNameHere[2].HouseNumber"                   value="2">
<input type="text" name="variableNameHere[3].HouseNumber" id="whateverid22" value="3">

L'index sur la liste <> DOIT toujours être basé sur zéro et séquentiel. 0,1,2,3.

[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
     int counter = MyHomes.Count()
     foreach(var home in MyHomes)
     { ... }
}

L'utilisation de IEnumerable<> pour des index non nuls et non séquentiels est post-back. Nous devons ajouter une entrée cachée supplémentaire pour aider le classeur.

<input type="hidden" name="variableNameHere.Index" value="278">
<input type="text" name="variableNameHere[278].HouseNumber" id="id"      value="3">

<input type="hidden" name="variableNameHere.Index" value="99976">
<input type="text" name="variableNameHere[99976].HouseNumber" id="id3"   value="4">

<input type="hidden" name="variableNameHere.Index" value="777">
<input type="text" name="variableNameHere[777].HouseNumber" id="id23"    value="5">

Et le code doit juste utiliser IEnumerable et appeler ToList()

[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
     int counter = variableNameHere.ToList().Count()
     foreach(var home in variableNameHere)
     { ... }
}

Il est recommandé d'utiliser un seul modèle ou un ViewModel (modèle contenant d'autres modèles pour créer un modèle "Vue" complexe) par page. Mélanger et assortir tel que proposé pourrait être considéré comme une mauvaise pratique, mais tant que cela fonctionne et qu'il est lisible, ce n'est pas MAUVAIS. Cependant, il démontre la puissance et la flexibilité du moteur Razor.

Ainsi, si vous devez ajouter quelque chose d'arbitraire ou remplacer une autre valeur fournie par un assistant Razor, ou si vous ne voulez pas créer vos propres assistants, pour un seul formulaire utilisant une combinaison inhabituelle de données, vous pouvez rapidement utiliser ces méthodes pour accepter des informations supplémentaires. Les données.

36
Piotr Kula

Si vous souhaitez obtenir les données de formulaire directement à partir de la requête HTTP, sans aucune liaison de modèle ni FormCollection, vous pouvez utiliser ceci:

[HttpPost] 
public ActionResult SubmitAction() {

    // This will return an string array of all keys in the form.
    // NOTE: you specify the keys in form by the name attributes e.g:
    // <input name="this is the key" value="some value" type="test" />
    var keys = Request.Form.AllKeys;

    // This will return the value for the keys.
    var value1 = Request.Form.Get(keys[0]);
    var value2 = Request.Form.Get(keys[1]);
}
15
A-Sharabiani