Cómo recibir datos desde un formulario POST en ASP.NET MVC

Enviar datos desde un formulario web hacia el servidor con el método Http POST, es uno de los procesos más habituales en el desarrollo de aplicaciones web de gestión empresarial. Cuando Microsoft lanzó su primera versión del framework .NET MVC, cambió radicalmente la forma de tratar los formularios web (hasta el momento ASP.NET Web forms), suprimiendo los antiguos postbacks y adaptando a los estándares web de la W3C la forma en que las Vistas y Controladores intercambian información.

En este Artículo veremos las tres diferentes formas de las que dispone un Controlador ASP.NET MVC (sus Acciones) para recibir datos desde un formulario web mediante el método Http POST.

 

1. Definiendo parámetros como variables

Partiremos de un caso bastante simple, donde queremos enviar desde la Vista los datos de inicio de sesión (Login) de un usuario determinado, a través de un formulario básico en HTML.

login-mvc

<div class="row">
    <div class="col-md-3 form-horizontal">
        <form action="/Home/Index" method="post">
            <br />
            <input type="text" class="form-control" name="usr" placeholder="Usuario" required autofocus>
            <br />
            <input type="password" class="form-control" name="pwd" placeholder="Contraseña" required>
            <br />
            <button class="btn btn-primary" type="submit">
                Iniciar sesión
            </button>
            <label class="checkbox pull-right">
                <input type="checkbox" name="rme">
                <label>Recordarme</label>
            </label>
        </form>
    </div>
</div>

Recibir estos datos en el Controlador, es tan sencillo como definir un parámetro por cada variable de formulario en la Acción correspondiente. La única condición requerida, es que el nombre de las variables (atributo name= de la etiqueta HTML) coincida con el nombre del parámetro definido en la Acción (sensible a mayúsculas y minúsculas).

[HttpPost]
public ActionResult Index(string usr, string pwd, string rme)
{
    // Aquí cualquier uso de las variables 'usr', 'pwd' y 'rme'
    return View("Index");
}

 

2. Mediante la clase FormCollection

En ciertas ocasiones, el número de variables de formulario que debemos enviar al servidor es bastante grande, por ejemplo, un formulario de registro de datos de usuario. En esta situación, definir en la Acción un parámetro para cada variable de formulario es una labor bastante tediosa y engorrosa a nivel de código.

Para estos casos, ASP.NET MVC nos proporciona la clase FormCollection, a través de la cual podemos acceder a una colección del tipo Clave/Valor formada por los elementos contenidos en el Form desde el que se realiza el POST.

formulario

<div class="row">
    <form action="/Home/Index" method="post">
        <div class="col-md-3 form-horizontal">
            <br />
            <input type="text" class="form-control" name="Nombre" placeholder="Nombre" required>
            <br />
            <input type="text" class="form-control" name="Apellidos" placeholder="Apellidos" required>
        </div>
        <div class="col-md-3 form-horizontal">
            <br />
            <input type="password" class="form-control" name="Email" placeholder="Correo electrónico" required>
            <br />
            <button class="btn btn-primary" type="submit">
                Iniciar sesión
            </button>
        </div>
    </form>
</div>

A nivel de Controlador, definiremos un único parámetro del tipo FormCollection en la Acción correspondiente.

[HttpPost]
public ActionResult Index(FormCollection formCollection)
{
    string _nombre = formCollection["Nombre"];
    string _apellidos = formCollection["Apellidos"];
    string _email = formCollection["Email"];
    // Aquí cualquier uso de las variables '_nombre', 
    // '_apellidos' y '_email'
    return View("Index");
}

 

3. Usando un Modelo de datos (Model binding)

Como ya sabemos, los Modelos de datos en ASP.NET MVC, son los elementos o entidades que entre otras cosas, nos permiten intercambiar información entre los Controladores y las Vistas.

Si queremos aprovechar todo el potencial que nos ofrece ASP.NET MVC para enviar datos desde un formulario web al servidor, es siempre una buena práctica definir y utilizar Modelos de datos que encapsulen la información que se quiere intercambiar entre las distintas capas lógicas de nuestra aplicación.

El Model Binding es una funcionalidad de ASP.NET MVC, que no solo nos permite encapsular en un Modelo los datos que han de ser enviados desde un formulario web hacia la Acción de un determinado Controlador, si no que además realiza el enlace de los datos entre las capas lógicas de la aplicación de una manera automática y eficiente.

Para entender cómo funciona el Model Binding realizaremos el mismo ejemplo anterior, pero en este caso definiremos un Modelo de datos que represente el conjunto de variables del formulario web que queremos enviar al servidor. Este Modelo deberá proporcionar al Model Binding toda la información posible acerca de los datos que contiene, facilitando así las labores de enlace y validación de datos.

    public class Usuario
    {
        public Usuario()
        {
            this.Id = Guid.NewGuid();
            this.Creado = DateTime.Now;
        }

        [Key]
        [Required]
        public Guid Id { get; set; }

        [Required]
        public DateTime Creado { get; set; }

        [Required(ErrorMessage = "Nombre es requerido")]
        [StringLength(50, ErrorMessage = "Logitud máxima 50")]
        public string Nombre { get; set; }

        [Required(ErrorMessage = "Apellido es requerido")]
        [StringLength(50, ErrorMessage = "Logitud máxima 50")]
        public string Apellidos { get; set; }

        [Required(ErrorMessage = "Email es requerido")]
        [StringLength(100, ErrorMessage = "Logitud máxima 100")]
        [DataType(DataType.EmailAddress, ErrorMessage = "Email error")]
        [EmailAddress(ErrorMessage = "Correo electrónico incorrecto")]
        public string Email { get; set; }
    }

 

En lo que respecta a la Vista, en este caso construiremos el formulario web utilizando los HTM Helpers de ASP.NET MVC. También debemos indicar a la Vista el Modelo de datos con el que trabajará el Model Binding, a través del la propiedad @model.

@model Usuario

<div class="row">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        <div class="col-md-3 form-horizontal">
            <br />
            @Html.TextBoxFor(x => x.Nombre,
               new { @class = "form-control", placeholder = "Nombre", autofocus = "autofocus" })
            @Html.ValidationMessageFor(x => x.Nombre, null, new { @class = "text-danger" })
            <br />
            @Html.TextBoxFor(x => x.Apellidos,
               new { @class = "form-control", placeholder = "Apellidos" })            
            @Html.ValidationMessageFor(x => x.Apellidos, null, new { @class = "text-danger" })
        </div>
        <div class="col-md-3 form-horizontal">
            <br />
            @Html.TextBoxFor(x => x.Email,
               new { @class = "form-control", placeholder = "Correo electrónico" })
            @Html.ValidationMessageFor(m => m.Email, null, new { @class = "text-danger" })
            <br />
            <button class="btn btn-primary" type="submit">
                Enviar datos
            </button>
        </div>
    }
</div>

form-mvc

El proceso de recepción de datos en el Controlador es bastante simple, solo debemos definir un parámetro en la Acción correspondiente, del tipo del Modelo de datos utilizado. A través de la propiedad ModelState.IsValid de la clase Controller, comprobaremos si los datos recibidos desde el formulario web cumplen las condiciones de validación indicadas en la definición del Modelo de datos.

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index(Usuario usuario)
        {
            if (ModelState.IsValid)
            {
                string _nombre = usuario.Nombre;
                string _apellidos = usuario.Apellidos;
                string _email = usuario.Email;
                // Aquí cualquier uso de las variables del Modelo
            }
            return View("Index");
        }

Conclusión

Evidentemente, el potencial de ASP.NET MVC a la hora de tratar el envío de datos al servidor mediante Http POSTes notablemente superior al que ofrece ASP.NET Web Forms con sus ya conocidos postbacks. Solo indicar por último, que los tres métodos vistos anteriormente no son exclusivos, o sea, podemos utilizarlos conjuntamente en una Acción de Controlador, si así fuera necesario: public ActionResult Index(string usr, string pwd, string rme, FormCollection formCollection, Usuario usuario) { }.

   EtiquetasASP.NET .NET MVC C#

  Compartir


  Nuevo comentario

El campo Comentario es obligatorio.
El campo Nombre es obligatorio.

Enviando ...

  Comentarios

facu facu

Excelente, puedo usar mas de un model por vista? como sería? gracias
Rafael Acosta Administrador Rafael Acosta

@facu:


Gracias por tu comentario.


No puedes usar más de un Model por Vista. Lo que si puedes hacer, es crearte un Modelo compuesto o ViewModel que contenga todos los Modelos que quieres enviar al Controlador.


Por ejemplo, si quieres enviar los datos de un usuario (clase Usuario) y además su dirección (clase Direccion)


public class Direccion 
{
public int Id{ get; set; }
public string Calle { get; set; }
public string CodPostal { get; set; }
}

Lo que debes hacer es crearte una nueva clase UsuarioViewModel, que contenga ambos Modelos:


public class UsuarioViewModel
{
public Usuario Usuario { get; set; }
public Direccion Direccion { get; set; }
}

Ahora deberás remodelar la Vista y la Acción del Controlador, para que acepte mediante Model Binding este nuevo Modelo.


Alex Alex

Al enviar los datos del formulario a al controlador Post estos se registran en blanco, cual es el posible problema a esto?
Oleiny Oleiny

Simplemente, Majistral!!!
marianna marianna

Hello, it’s Philip Flowers here!
I work as a professional an essay writer and have created this content with the intent of changing your life for the better. I started honing my writing talent in my school years. I learned that my fellow students needed writing help—and they were willing to pay for it. The money was enough to help pay my tuition for my first semester of college.
Ever since college, I have continued to work as a professional writer. I was hired by a writing service based in the United Kingdom. Since then, the research papers that I have written have been sold around Europe and the United States.
In my line of work, I have become used to hearing, “Philip, can you help me meet my writing assignment deadline?” I know that I can provide this service.

Professional Writer – Philip Flowers – <a href=https://www.cleanurbanenergy.com/>www.cleanurbanenergy.com</a>Company

Cindyalace Cindyalace

Spring cleansing is not only trite to eliminate dirt and filth. But our experts need to administer an audit of winter months apparel. From excessive factors to get rid of, you require to well-maintained and determine the storage space. Throw out the junk and offer your own self an additional promise not to spare unnecessary junk. Well-maintained the walls as well as ceilings, wash the windows, let the spring season into our home, drive off the inactivity.

Washing in NYC - is actually the stipulation of concentrated services for springtime cleansing of premises and also neighboring locations, and also maintaining cleanliness. The mix of high-grade work and also economical rates is actually a unique component that distinguishes our cleansing firm in the NJ cleaning services market.
Our adage: "The best premium - low cost!" and you could be sure of that! In our provider, incredibly inexpensive prices for all types of cleaning services.
Our experts ensure you the provision of qualified cleaning services at a higher amount. Specialists masterfully master the methods of cleansing along with the use of modern-day state-of-the-art equipment and also specialized chemicals. With all this, the costs for our services are much lower than the significant cleaning providers.

Getting such a service as "Spring Cleaning" in our firm, you obtain the option of premium cleaning of the neighboring region of our home. We offer cleaning up where others can not deal. We are going to come to you even though you go to the different end of the world as well as perform the cleansing at the highest degree. Simply give us a call.

A cleaning company Chelsea : <a href=https://springcleaning.pro>spring cleaning</a>
ecoMus ecoMus

<b><a href=https://eco-corporation.ru></a></b>


leticia leticia

Good day and welcome to my website . I’m Leticia Figuero.
I have always dreamed of being a book writer but never dreamed I’d make a career of it. In college, though, I aided a fellow student who needed help. She could not stop telling me how well I had done. Word got around and someone asked me for to help them just a week later. This time they would pay me for my work.
During the summer, I started doing research paper writing for students at the local college. It helped me have fun that summer and even funded some of my college tuition. Today, I still offer my research paper writing to students.

Academic Writer – Leticia Figuero – <a href=http://www.learningbenefits.net/>www.learningbenefits.net</a> Company

ecoMus ecoMus

<b><a href=https://eco-corporation.ru></a></b>


ecoMus ecoMus

<b><a href=https://eco-corporation.ru></a></b>


leticia leticia

Thanks for stopping by my page! I’m Leticia Figuero.
Even though I jokingly credit my aunt for my writing talent, I know that it is a ability I have fostered from childhood. Though my mother is a writer, I also started out young.
I’ve always had a way with words, according to my favorite teacher . I was always so excited in history when we had to do a research assignment .
Now, I help current students achieve the grades that have always come easily to me. It is my way of giving back to schools because I understand the obstacles they must overcome to graduate.

Leticia Figuero – Professional Writer – <a href=http://www.learningbenefits.net/>www.learningbenefits.net</a> Corp

Perfil para Rafael Acosta en Stack Overflow en español, preguntas y respuestas para programadores y profesionales de la informática.

  Etiquetas

.NET Core .NET Framework .NET MVC .NET Standard AJAX ASP.NET ASP.NET Core ASP.NET MVC Bootstrap Buenas prácticas C# Cookies Entity Framework Gráficos JavaScript jQuery JSON JWT PDF Pruebas Unitarias Seguridad SEO SOAP Sql Server SqLite Swagger Validación Web API Web Forms Web Services WYSIWYG

  Nuevos


  Populares















Utilizamos cookies propias y de terceros para mejorar nuestros servicios y ofrecerle una mejor experiencia de navegación. Si continúa navegando consideramos que acepta su uso. Más información   Acepto