114 votes

Question simple sur MVC3 - Comment récupérer les valeurs d'un formulaire depuis HTTPPOST, par dictionnaire ou ?

Une question simple. J'ai un contrôleur mvc qui a une méthode :

[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 puis-je accéder aux valeurs des paramètres ? Je ne publie pas de message à partir d'une vue, le message provient de l'extérieur. Je suppose qu'il existe une collection de paires clé/valeur à laquelle j'ai accès. J'ai essayé Request.Params.Get("simpleTextBox") ; mais il renvoie l'erreur "Sorry, an error occurred while processing your request.".

Je suis sûr qu'il y a une réponse simple à cela.

155voto

Darin Dimitrov Points 528142

Vous pouvez faire en sorte que l'action du contrôleur prenne un objet qui reflète les noms des entrées du formulaire et que le modèle de liaison par défaut crée 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 ...
}

107voto

Adeel Points 9888

Simplement, vous pouvez utiliser FormCollection comme,

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

vous pouvez également utiliser une classe, qui est mappée avec les valeurs du formulaire, et le moteur asp.net mvc la remplit automatiquement.

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

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

36voto

ppumkin Points 3543

Les réponses sont très bonnes mais il existe une autre méthode dans la dernière version de MVC et de .NET que j'aime vraiment utiliser, au lieu de la "vieille école" FormCollection et des clés de requête.


Considérons un extrait HTML contenu dans une balise de formulaire qui effectue un AJAX ou un 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 essaiera de vous les fournir en tant que paramètres du type défini. J'ai inclus la case à cocher car elle est délicate. Elle renvoie le texte "on" si elle est cochée et null si elle ne l'est pas. L'exigence cependant est que ces variables définies DOIVENT exister (à moins qu'elles ne puissent être nulles), sinon le retour 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 renvoyer un modèle sans utiliser d'aide au rasage. J'ai constaté que cela est parfois nécessaire.

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

Le balisage HTML sera simplement ...

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

et votre contrôleur vous demandera le modèle.

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

Lorsqu'un contrôleur attend un modèle, il n'est pas nécessaire de définir TOUS les champs car l'analyseur syntaxique les laissera par défaut, généralement NULL. Ce qui est bien, c'est que vous pouvez mélanger plusieurs modèles dans le balisage et l'analyseur de retour remplira autant de champs que possible. Il n'est pas nécessaire de définir un modèle sur la page ou d'utiliser des aides.


Il est toutefois recommandé d'utiliser un seul modèle ou un seul viewmodel par page. Le mélange et l'assortiment comme proposé est une mauvaise pratique, mais il démontre la puissance du tout nouveau moteur. Ainsi, si vous avez besoin d'ajouter quelque chose d'arbitraire ou de remplacer une autre valeur d'une aide Razor, ou si vous n'avez tout simplement pas envie de créer vos propres aides, vous pouvez rapidement utiliser ces méthodes pour accepter des données supplémentaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X