¿Cómo recuperar valores de formulario de HTTPPOST, dictionary o?

Tengo un controlador MVC que tiene este método de acción:

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

La forma es una forma no trivial con un simple cuadro de texto.

Pregunta

¿Cómo accedo a los valores de los parámetros?

No estoy publicando desde una Vista, la publicación viene de manera externa. Supongo que hay una colección de pares clave / valor a los que tengo acceso.

Intenté Request.Params.Get("simpleTextBox"); pero devuelve el error “Lo sentimos, se produjo un error al procesar su solicitud”.

Puede hacer que su acción de controlador tome un objeto que refleje los nombres de entrada de formulario y el cuaderno de modelo predeterminado creará automáticamente este objeto para usted:

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

Otra forma (obviamente más fea) es:

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

Simplemente, puedes usar FormCollection como:

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

También puede usar una clase, que está correlacionada con valores de Formulario, y el motor asp.net mvc la rellena automáticamente:

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

Las respuestas son muy buenas, pero hay otra forma en la última versión de MVC y .NET que realmente me gusta usar, en lugar de las claves FormCollection y Request de la “vieja escuela”.


Considere un fragmento de HTML contenido dentro de una etiqueta de formulario que realiza un AJAX o un FORMATO POST.

   

Su controlador realmente analizará los datos del formulario e intentará entregárselos como parámetros del tipo definido. Incluí la checkbox porque es complicada. Devuelve el texto “on” si está marcado y nulo si no está marcado. Sin embargo, el requisito es que estas variables definidas DEBEN existir (a menos que sean nulables (recuerde que esa string es anulable)) de lo contrario, la AJAX o POST volverán a fallar.

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

También puede publicar un modelo sin usar ayuda de afeitar. Me he encontrado con que esto es necesario algunas veces.

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

El marcado HTML será simplemente …

  

y su controlador (Razor Engine) interceptará la variable de forma “MyHome” y tratará de comstackrla y echarla a MyModel.

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

Cuando un controlador está esperando un Modelo, no tiene que definir TODOS los campos, ya que el analizador simplemente los dejará en el valor predeterminado, por lo general NULO. Lo bueno es que puede mezclar y combinar varios modelos en el marcado y el análisis posterior de la publicación poblará tanto como sea posible. No necesita definir un modelo en la página o usar ayudantes.

SUGERENCIA: El nombre del parámetro en el controlador es el nombre definido en el marcado HTML “nombre =”, ¡no el nombre del Modelo!


Usar List<> es un poco más complejo en su margen de beneficio.

     

Índice en la Lista <> DEBE ser siempre cero y secuencial. 0,1,2,3.

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

El uso de IEnumerable<> para índices no basados ​​en cero y no secuenciales se publica posteriormente. Necesitamos agregar una entrada oculta adicional para ayudar a la carpeta.

       

Y el código solo necesita usar IEnumerable y llamar a ToList()

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

Se recomienda utilizar un único modelo o un modelo de vista (modelo que contiende otros modelos para crear un modelo complejo de ‘Vista’) por página. Mezclar y combinar según lo propuesto podría considerarse una mala práctica, pero mientras funcione y sea legible no es MALO. Sin embargo, demuestra la potencia y la flexibilidad del motor Razor.

Por lo tanto, si necesita agregar algo arbitrario o anular otro valor de un ayudante Razor, o simplemente no tiene ganas de hacer sus propios ayudantes, para un solo formulario que utiliza una combinación inusual de datos, puede usar rápidamente estos métodos para aceptar más datos.

Si desea obtener los datos del formulario directamente desde la solicitud Http, sin ningún tipo de enlaces de modelo o FormCollection puede usar esto:

 [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 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]); }