Sunday, August 27, 2017

CRUD - ASP.NET MVC 5 + ADO.NET C# - [Listado y Ver]

Hola! Continuamos con el proyecto MVC5 + ADO.NET Hasta aquí ya tienes las capas Entity, Data, Buesiness y Web creadas.

Nota. No utilizaré el folder Models que trae consigo MVC5 ya que estoy utilizando la capa Entity la cual viene a ser lo mismo con la diferencia que está separado en un proyecto a parte.

En esta parte de esta entrada únicamente veremos el tema de Listado de Productos y Ver Productos. En las siguientes veremos el de Crear Producto, Editar Producto y Eliminar Producto.

C. Create /Crear Producto
R. Read / Listado de Productos
U. Update /Editar Productos
D. Delete / Eliminar Producto

Empecemos.

Clic derecho Controllers Agregar Controlador Yo lo llamé ProductoController. (ojo, la palabra Controller al final es por convención)

El controlador lo crearemos de cero, sin usar plantillas ni nada de lo que Visual Studio provee. Entonces creemos el constructor, en el constructor iniciaremos nuestro objeto Business que es el que hemos dicho en entradas anteriores que será el encargado de comunicar al proyecto web con la data.

Creamos también los métodos Listado y Ver que devuelven un ActionResult. El método listado tendrá su versión HttpGet y HttpPost.

¿Por qué Listado lleva HttpGet y HttpPost? Get lo ocuparemos cuando cargue la página, será una consulta de todos los productos (hacer un select sin where en caso de que sepas que pueden haber muchas tuplas de resultado sin dudas no es buena práctica) y ocuparemos el Post cuando el usuario interactúe con nuestro sistema de filtrado para listar los productos.

Se tendría que ver algo así:




Nota: Estoy usando un Layout (o master page si vienes de WebForms) En el Layout hago mis llamadas tanto a las hojas de estilos como a los códigos JS. Estoy usando Bootstrap4

El código es como sigue a continuación:

ProdutoController


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Business;
using Entity;
using System.Data;

namespace Web.Controllers
{
    public class ProductoController : Controller
    {
        private ProductoBusiness _business;
        private ProveedorBusiness prov;
        private CategoriaBusiness cate;

        public ProductoController()
        {
            _business = new ProductoBusiness();
            prov = new ProveedorBusiness();
            cate = new CategoriaBusiness();
        }

        public ActionResult Listado()
        {
            ModelState.Clear();
            return View(_business.GetAll());
        }

        [HttpPost]
        public ActionResult Listado(int? txtCodigoProducto, string txtNombreProducto)
        {
            if (txtCodigoProducto == null) {
                txtCodigoProducto = 0;
            }
            //if (txtNombreProducto == string.Empty){
            //    txtNombreProducto = "-1";
            //}

            Producto p = new Producto();
            p.Id = (int)txtCodigoProducto;
            p.Nombre = txtNombreProducto;

            List resultado = (List)_business.SearchBy(p);

            WriteMessage(Eoperacion.reset, Etipo.info);
            if (resultado.Count == 0)
            {
                WriteMessage(Eoperacion.find, Etipo.info);
            }

            return View(resultado);
        }

        public ActionResult Ver(int id)
        {
            Producto p = new Producto();
            p = _business.GetById(id);
            return View(p);
        }

     

        #region Metodos Auxiliares      
        public enum Eoperacion : byte
        {
            insert = 1,
            update = 2,
            delete = 3,
            find = 4,
            reset = 5
        }

        public enum Etipo : byte
        {
            success = 1,
            danger = 2,
            info = 3
        }

        public void WriteMessage(Eoperacion Operacion, Etipo Tipo)
        {
            if (Tipo == Etipo.success)
            {
                switch (Operacion)
                {
                    case Eoperacion.insert:
                        ViewBag.MensajeExito = "El producto ha sido correctamente creado.";
                        break;
                    case Eoperacion.update:
                        ViewBag.MensajeExito = "El producto ha sido correctamente editado.";
                        break;
                    case Eoperacion.delete:
                        ViewBag.MensajeExito = "El producto ha sido correctamente eliminado.";
                        break;

                }
            }
            else if(Tipo == Etipo.danger)
            {
                switch (Operacion)
                {
                    case Eoperacion.insert:
                        ViewBag.MensajeError = "No se ha podido crear el producto.";
                        break;
                    case Eoperacion.update:
                        ViewBag.MensajeError = "No se ha podido editar el producto";
                        break;
                    case Eoperacion.delete:
                        ViewBag.MensajeError = "No se ha podido eliminar el producto";
                        break;

                }

            }
            else
            {
                switch (Operacion)
                {
                    case Eoperacion.find:
                        ViewBag.MensajeBusqueda = "No se encontraron resultados para su búsqueda.";
                        break;
                    case Eoperacion.reset:
                        ViewBag.MensajeBusqueda = "";
                        break;

                }
            }
        }
        #endregion

    }

}

Perfecto, ya estaría nuestro controlador, ahora hacemos clic derecho sobre el nombre de nuestro método Listado y agregamos la Vista. Visual Studio automáticamente agregará la Vista dentro de la carpeta Views. Aprovechamos para agrega la Vista Ver también.

Cambio importante, dentro del proyecto web, ubicar la carpeta App_Start y dentro del archivo RouteConfig.cs, realizar el siguiente cambio:


 public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Producto", action = "Listado", id = UrlParameter.Optional }
            );
        }


Ok, a continuación expongo el código de la Vista Listado y Vista Ver:

Vista LISTADO DE PRODUCTOS

@model IEnumerable

@{
    ViewBag.Title = "Listado de Productos";
}

Listado de Productos

@using (Html.BeginForm()) {
@Html.Label("Código:", new { @class = "pr-3 control-label text-white d-none d-lg-block" }) @Html.TextBox("txtCodigoProducto", null, new { @class = "form-control", @placeholder = "Código" })
@Html.Label("Nombre:", new { @class = "pr-3 control-label text-white d-none d-lg-block" }) @Html.TextBox("txtNombreProducto", null, new { @class = "form-control", @placeholder = "Nombre" })
}
@foreach (var item in Model) { }
@Html.DisplayNameFor(model => model.Id) @Html.DisplayNameFor(model => model.Nombre) @Html.DisplayNameFor(model => model.Descripcion) @Html.DisplayNameFor(model => model.PrecioUnitario) @Html.DisplayNameFor(model => model.Stock) @Html.DisplayNameFor(model => model.Proveedor) @Html.DisplayNameFor(model => model.Categoria) @Html.DisplayNameFor(model => model.Estado) Acciones
@Html.DisplayFor(mitem => item.Id) @Html.DisplayFor(mitem => item.Nombre) @Html.DisplayFor(mitem => item.Descripcion) @Html.DisplayFor(mitem => item.PrecioUnitario) @Html.DisplayFor(mitem => item.Stock) @Html.DisplayFor(mitem => item.Proveedor) @Html.DisplayFor(mitem => item.Categoria) @{ if (item.Estado == true) { Activo } else { Inactivo } }
@ViewBag.MensajeBusqueda


Vista VER PRODUCTOS

@model Entity.Producto

@{
    ViewBag.Title = "Ver Producto";
}

Información del Producto @(Model.Nombre)

Código:
@Model.Id
Nombre:
@Model.Nombre
Descripción:
@Model.Descripcion
Precio Unitario:
@Model.PrecioUnitario
Stock:
@Model.Stock
Proveedor:
@Model.Proveedor
Categoría:
@Model.Categoria
Estado:
@{ if (Model.Estado == true) { Activo } else { Inactivo } }
@Html.ActionLink("Regresar al Listado", "Listado")

1 comment: