Comment récupérer les valeurs de formulaire de HTTPPOST, de 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 une forme non sortingviale avec une simple zone de texte.

Question

Comment accéder aux valeurs des parameters?

Je ne publie pas depuis une vue, la publication est externe. Je suppose qu’il y a une collection de paires clé / valeur à laquelle j’ai access.

J’ai essayé Request.Params.Get("simpleTextBox"); mais il renvoie une erreur “Désolé, une erreur est survenue lors du traitement de votre demande.”.

Vous pouvez faire en sorte que l’action de votre contrôleur prenne un object qui reflète les noms d’entrée du formulaire et le classeur par défaut crée automatiquement cet object 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 manière (évidemment plus moche) est:

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

Simplement, vous pouvez utiliser FormCollection comme:

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

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

 //Defined in another file class MyForm { public ssortingng var1 { get; set; } } [HttpPost] public ActionResult SubmitAction(MyForm form) { ssortingng var1 = form1.Var1; } 

Les réponses sont très bonnes, mais la dernière version de MVC et de .NET a un autre moyen que j’aime vraiment utiliser, au lieu des clés FormCollection et Request “old school”.


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

   

Votre contrôleur parsingra les données du formulaire et tentera de vous les transmettre en tant que parameters du type défini. J’ai inclus la case à cocher car celle-ci est délicate. Il renvoie le texte “on” s’il est coché et nul s’il n’est pas coché. L’exigence cependant est que ces variables définies DOIVENT exister (sauf si elles sont nullables (rappelez-vous que cette ssortingng est nullable)) sinon le retour AJAX ou POST échouera.

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

Vous pouvez également publier un modèle sans utiliser d’aide au razor. Je suis tombé sur ce besoin quelques fois.

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

Le balisage HTML sera simplement …

  

et votre contrôleur (Razor Engine) interceptera la variable de formulaire “MyHome” et essaiera de la construire et de la convertir en MyModel.

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

Lorsqu’un contrôleur attend un modèle, vous n’avez pas besoin de définir TOUS les champs car l’parsingur les laissera simplement par défaut, généralement NULL. Ce qui est bien, c’est que vous pouvez combiner différents modèles sur le Mark-up et que la post-parsing sera aussi complète que possible. Vous n’avez pas besoin de définir un modèle sur la page ou d’utiliser des assistants.

CONSEIL: Le nom du paramètre dans le contrôleur est le nom défini dans la balise HTML “name =” et non le nom du modèle!


Utiliser List<> est un peu plus complexe dans son balisage.

     

Index on List <> DOIT toujours être basé sur zéro et séquentiel. 0,1,2,3.

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

Utiliser IEnumerable<> pour les index non basés sur zéro et les index non séquentiels. Nous devons append une entrée cachée supplémentaire pour aider le classeur.

       

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

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

Il est recommandé d’utiliser un seul modèle ou un modèle ViewModel (modèle contenant d’autres modèles pour créer un modèle de vue complexe) par page. Mélanger et faire correspondre comme proposé pourrait être considéré comme une mauvaise pratique, mais tant que cela fonctionne et est lisible, ce n’est pas MAUVAIS. Cela démontre toutefois la puissance et la souplesse du moteur Razor.

Donc, si vous avez besoin d’abandonner quelque chose d’arbitraire ou de remplacer une autre valeur par un assistant Razor, ou si vous ne souhaitez pas créer vos propres aides, vous pouvez rapidement utiliser ces méthodes pour un formulaire unique qui utilise une combinaison inhabituelle de données. Les données.

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

 [HttpPost] public ActionResult SubmitAction() { // This will return an ssortingng array of all keys in the form. // NOTE: you specify the keys in form by the name atsortingbutes eg: //  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]); }