ÍNDICE

    1. INTRODUCCIÓN

    2. ACCESO A DATOS

            2. 1. ~/Documentos/empleados.xml y ~/Models/Empleado.cs

            2. 2. ~/Models/ModeloEmpleados.cs

     3. FILTRADO Y ORDENACIÓN

            3. 1. ~/Views/Home/Index.cshtml

            3. 2. ~/Controllers/HomeController.cs

 

1. INTRODUCCIÓN

En este proyecto, como método de acceso a datos utilizaremos LINQ to XML. Esta interfaz de programación agrupa la potencia de consultas LINQ, junto con el popular formato de datos XML, permitiéndonos trabajar en el entorno .NET.

El software utilizado es Visual Studio Enterprise 2017 versión 15.5.7. También se ha utilizado la herramienta gratuita Mockaroo para la generación del fichero XML con datos de muestra generados aleatoriamente.

Mediante la siguiente configuración en Mockaroo, obtenemos nuestro documento XML con los datos sobre los que realizaremos el filtrado y ordenado de nuestras búsquedas.

ordenacion_1

Desde Visual Studio, creamos un nuevo proyecto ASP .NET Web Application (.NET Framework) en lenguaje C#, marcando la casilla de MVC dentro del apartado de plantillas. Primero configuraremos el acceso a datos, y después su filtrado y ordenación.

La captura que aparece a continuación muestra la estructura de los documentos que han sido modificados o incluidos a lo largo del proyecto.

ordenacion_2

 

2. ACCESO A DATOS

2. 1. ~/Documentos/empleados.xml y ~/Models/Empleado.cs

Lo primero será crearnos en la raíz de nuestro proyecto la carpeta Documentos, donde incluiremos el fichero empleados.xml para tener accesibles los datos.

En la carpeta Models, nos crearemos la clase pública Empleado, dentro de la cual definiremos las diferentes propiedades que la componen según los elementos del XML.

ordenacion_3

 

2. 2. ~/Models/ModeloEmpleados.cs

Siguiendo en la misma carpeta, es el momento de crearnos nuestro modelo, mediante el cual podremos obtener una lista de empleados mediante el uso de LINQ to XML.

Añadimos la clase ModeloEmpleados, y en ella definimos e inicializamos las variables string uri y XDocument documento para poder acceder al XML y leer su contenido. Señalar que la dirección Uri la recibirá el constructor de nuestro modelo una vez lo llamemos desde el Controller de la vista que muestre los datos, lo cual se explicará más adelante.

ordenacion_4

Una vez que tenemos las variables globales y el constructor de nuestro modelo, vamos a dejar preparados los dos métodos necesarios para mostrar los datos:

  • List<Empleado> GetEmpleados()
  • List<Empleado> GetEmpleadosPost(string propiedadF, string propiedadO, string texto, string orden, int fecha)

El método GetEmpleados() lo utilizaremos para la petición GET de nuestra página donde mostraremos todos los empleados al iniciar el proyecto.

En este método realizamos una consulta mediante LINQ to XML. Su lógica es muy sencilla: tenemos que hacer la selección a partir de los elementos del XDocument inicializado anteriormente en el constructor del modelo, y para cada elemento vamos creando un objeto del tipo Empleado. Terminamos el método devolviendo la lista de los empleados.

ordenacion_5

El método GetEmpleadosPost(…) lo utilizaremos en la misma página, pero cuando se realiza la petición POST una vez que se ha pulsado el botón del formulario que realiza el submit con los parámetros de filtrado y ordenación definidos. Los parámetros de este método se corresponden con los controles del formulario de la vista.

Comenzaremos recogiendo en una lista de empleados el total de elementos disponibles del XML reutilizando el método anterior.

La finalidad de nuestro proyecto es poder ordenar y filtrar los datos, pudiendo ejercer estas dos acciones sobre diferentes columnas, por lo que nuestro método debe poder realizar consultas dinámicas según qué columna especifiquemos. Para conseguir esto, y acceder a las propiedades de Empleado de forma dinámica, utilizaremos reflection en expresiones lambda. Esto se realiza almacenando en una variable la propiedad obtenida mediante typeof(Empleado).GetProperty(propiedad) y utilizándola después en la expresión lambda.

ordenacion_6

Como puede verse en la captura anterior, vamos comprobando si hemos enviado parámetros para ordenar y/o filtrar. La acción de filtrar la he separado en filtrar por fecha o filtrar por cualquier otra columna (parámetro texto), para así ofrecer dos posibilidades de filtrado simultáneas.

En el caso de que el método reciba un texto, se habrá enviado también una columna de filtrado. Mediante una expresión lambda accedemos a la propiedad definida en el parámetro de la columna de filtrado.

Si se detecta un orden, de forma similar al filtrado se ordenará el listado de una forma u otra.

El filtrado y ordenamiento de los datos se va realizando sobre el mismo listado, por lo que la lista de empleados que se devuelve al final está correctamente tratada.

 

3. FILTRADO Y ORDENACIÓN

3. 1. ~/Views/Home/Index.cshtml

Empezaremos configurando los aspectos básicos de nuestra única vista. En ella incluiremos un formulario donde el usuario podrá seleccionar las columnas de la tabla sobre las que realizar el filtrado, y las columnas sobre las que ordenar de forma ascendente o descendente. También tendrá apartados para introducir el texto por el que filtrar, elegir el orden a aplicar y la fecha por si se desea filtrar a la vez por dos campos.

ordenacion_7

El atributo name de los diferentes elementos del formulario coincide con los parámetros del método GetEmpleadosPost(…) explicado anteriormente.

A continuación del formulario aparece la tabla donde se van mostrando los empleados según los parámetros definidos. Por defecto, en la petición GET, se muestran los 100 empleados totales del XML. Es necesario definir mediante lenguaje Razor que nuestra página recibirá en el modelo una lista de empleados, para ello incluimos al principio del HTML la línea @model List<OrdenacionDatosXml.Models.Empleado>.

Creamos la cabecera de la tabla con tantas columnas como propiedades tiene la clase Empleado. Después, en el cuerpo de esta, mediante la estructura @foreach (var e in Model) vamos insertando una fila por cada empleado de nuestro modelo.

La siguiente imagen muestra el ejemplo si seleccionamos que filtre por el texto “Chile” en la columna País, los resultados sean de una fecha superior al año 2003 y ordene de forma descendente por apellido.

ordenacion_8

No incluyo aquí el código HTML utilizado en estas capturas ya que tenéis disponible el proyecto entero para ser consultado en GitHub, cuyo enlace está al final de esta misma página.

 

3. 2. ~/Controllers/HomeController.cs

En el Controller de nuestra vista debemos llamar al modelo ModeloEmpleados que hemos creado antes, para que nuestra vista tenga datos que mostrar. Lo primero será crearnos un método para instanciar el modelo y pasarle como parámetro a su constructor la ruta del documento XML dentro de nuestro proyecto.

Esto lo hacemos en un método ya que, si lo hacemos desde el constructor del controlador, la dirección Uri resultaría nula. Este método lo llamaremos al comienzo del ActionResult de nuestra página, ya sea en la petición GET como en la POST.

ordenacion_9

El ActionResult de la petición GET es el que se ejecutará cuando abramos por primera vez nuestro proyecto. Su código es bastante sencillo, ya que lo único que necesitamos hacer es llamar al método CargarModelo() que acabamos de crearnos en el controlador, recoger todos los empleados en una lista y pasárselo al modelo de la página. Como detalle, hacemos un .Count de los elementos existentes en dicha lista y la pasamos por ViewBag para que el usuario tenga esta información disponible.

ordenacion_10

Cuando el usuario pulse el botón de submit, se ejecutará la petición POST de nuestro controlador. Lo más complicado en este momento es controlar todos los elementos del formulario en los parámetros del ActionResult. Los tipos de datos string aceptan nulos, a diferencia de los números int. Debido a esto, indicamos que la fecha de tipo int también puede aceptar valores nulos (si texto, orden o fecha son nulos, la funcionalidad asociada a ellos no se realizará).

Como en nuestro modelo hemos controlado todas las posibles condiciones, bien sea con todos los valores vacíos o nulos, o con todos los datos disponibles, obtenemos la lista de empleados llamando al método GetEmpleadosPost(…) y lo pasamos al modelo de nuestra vista. Volvemos a pasar por ViewBag el número de elementos.

ordenacion_11

Con esto ya hemos concluido el tema de LINQ to XML. Lo más importante en esta práctica es construir un buen modelo que cubra todas nuestras necesidades, en este caso sobre ordenación y filtrado de datos. Para ello, las expresiones lambda son una herramienta que nos permite con un código muy breve, tratar los datos de forma eficiente y funcional.

 


 

Autor: José Ramón Landriz

Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin

Centro: Tajamar

Año académico: 2017-2018

Enlaces: GitHub | LinkedIn