Programación de Aplicaciones Visuales II Objetivos del Ejercicio: realizar un proceso por pasos y en varias etapas que permita al lector construir una aplicación basada en datos utilizando ASP.NET. Algunas consideraciones: el ejercicio pretende ser una primera guía para integrar una serie de conceptos y elementos del lenguaje C# y el entorno ASP.NET en un caso práctico con objetivos concretos. Con la finalidad de que sea sencilla no se han tenido en cuenta elementos arquitecturales, de performance y, en algunos casos, de buenas prácticas. A veces esto se aclara mediante una nota. Pero queda a cargo del lector profundizar sobre los aspectos mencionados. Software y datos necesarios: Microsoft Visual Studio 2005 Microsoft.NET Framework SDK v2.0 El script para la base de datos: helpdesk.sql Errores, sugerencias: Todos los errores que detecte o sugerencias que estén dentro del objetivo de la presente guía enviarlos a: mecheverria@sistemas.frc.utn.edu.ar Página 1
Etapa 2 Objetivos de la etapa: Agregar una página para ingresar incidentes e implementar la validación de la entrada mediante el control adecuado en cada caso. Proceso: 1. Abrir Visual Studio y abrir el sitio web: Helpdesk 2. Agregaremos una nueva página NuevoIncidente.aspx basada en la Página Principal que creamos en la etapa 1 y la incluiremos en la estructura del sitio 3. La funcionalidad de esta página será: permitir registrar un nuevo incidente proveyéndole todos la información asociada, la cual debe ser validada antes de que la registración se haga efectiva En la siguiente tabla se describen todos los campos que contiene el formulario junto con el tipo de validación que se debe realizar para cada uno de ellos, deberá seleccionar en cada caso el control o los controles más apropiados para el tipo de validación Campo Control Tipo control Validación Título txttitulo TextBox Requerido Tipo ddltipo DropDownList Selección requerida Producto ddlproducto DropDownList Selección requerida Usuario txtusuario TextBox Requerido Email txtemail TextBox Requerido Dirección de email válida Descripción txtdescripcion TextBox Requerido (Multiline) Fecha txtfecha TextBox (Enabled=false) Estado ddlestado DropDownList Selección requerida Asignado a ddlasignadoa DropDownList Selección requerida Fecha txtfechaestimadaresolucion TextBox Requerida estimada Debe ser mayor o igual que la fecha de Debe ser una fecha válida resolución Debe tomar el valor de la fecha actual: DateTime.Now.ToString( dd/mm/yyyy ) Prioridad txtprioridad TextBox Requerido Debe ser un entero de 1 a 3 A continuación mostramos una imagen de la vista de diseño de la página. Tenga en cuenta que debe incluir un control ValidationSumary, preferentemente en la parte superior. Página 2
4. Las listas desplegables y la fecha actual las llenaremos al cargarse la página. Provisoriamente les asignaremos valores hardcode, en las próximas etapas haremos que estas listas se carguen desde la base de datos. De modo que el código del evento load de la página será algo así (recuerde la importancia de la propiedad IsPostback): protected void Page_Load(object sender, EventArgs e) if (!Page.IsPostBack) txtfecha.text = DateTime.Now.ToString("dd/MM/yyyy"); -","0")); ddltipo.items.add(new ListItem("---Seleccione una opción-- ddltipo.items.add(new ListItem("Tecnología","1")); ddltipo.items.add(new ListItem("Software","2")); ddltipo.items.add(new ListItem("Mantenimiento","3")); ddlproducto.items.add(new ListItem("---Seleccione una ddlproducto.items.add(new ListItem("Producto1","1")); ddlproducto.items.add(new ListItem("Producto2","2")); ddlproducto.items.add(new ListItem("Producto3","3")); ddlestado.items.add(new ListItem("---Seleccione una ddlestado.items.add(new ListItem("Registrado","1")); ddlestado.items.add(new ListItem("Asignado","2")); ddlestado.items.add(new ListItem("Suspendido","3")); ddlestado.items.add(new ListItem("Cancelado","4")); Página 3
ddlestado.items.add(new ListItem("Resuelto","5")); ddlasignadoa.items.add(new ListItem("---Seleccione una ddlasignadoa.items.add(new ListItem("Resolutor 1","1")); ddlasignadoa.items.add(new ListItem("Resolutor 2", "2")); 5. Para validar que haya un item válido seleccionado en las listas desplegables usaremos controles CustomValidator. Veremos como ejemplo la implementación en la lista Tipo. Debe proceder de manera similar para las otras listas. Para esto debe insertar un control CustomValidator junto al control ddltipo y asociarlo a este mediante la propiedad ControlToValidate 6. Ahora asigne las siguientes propiedades del control CustomValidator Text = * ErrorMessage = Debe seleccionar un tipo válido Display = Dynamic ClientValidationFunction="tipoSeleccionado" Esta última propiedad es para indicarle que función hará la validación en el cliente 7. Para crear la función tenemos la necesidad de crear una zona de contenido en la sección head de la página principal para alojar el script. Luego de hacer esto, en la página NuevoIncidente.aspx asociaremos una zona de contenido donde pondremos el script de validación en el cliente <asp:content ID="HeadContent" ContentPlaceHolderID="Head" Runat="Server"> <script language="javascript" type="text/javascript"> <!-- function tiposeleccionado(source, arguments) if (arguments.value < 1) arguments.isvalid = false; arguments.isvalid = true; //--> </script> </asp:content> 8. Ahora crearemos la función de validación en el servidor. Para esto visualizaremos los eventos del control custipo mediante el botón de la ventana de propiedades y haciendo doble click en el evento ServerValidate se creará el método de evento correspondiente, en el código. Página 4
El código para manejar esta validación en el servidor tendrá la misma lógica que el del cliente pero, naturalmente, está implementado en C# protected void custipo_servervalidate(object source, ServerValidateEventArgs args) if (ddltipo.selectedindex > 1) args.isvalid = true; args.isvalid = false; 9. No implementaremos el guardado en esta etapa, pero para suplir esta funcionalidad exhibiremos un mensaje en el caso en que la validación haya sido superada. Por lo tanto agregaremos dos botones Guardar y Cancelar en la parte inferior del formulario. 10. En el caso del botón Guardar necesitamos comprobar antes de guardar que la validación es satisfactoria para eso usaremos la propiedad IsValid protected void btnguardar_click(object sender, EventArgs e) if (Page.IsValid) lblmensaje.text = "Incidente registrado con éxito"; lblmensaje.text = "No se pudo registrar el incidente"; 11. Cuando el usuario presione cancelar lo redirigiremos a la página Incidentes.aspx sin ninguna acción extra. Para que el al presionar el botón cancelar no se disparen las validaciones debemos recordar poner la propiedad CausesValidation del botón en false. protected void btncancelar_click(object sender, EventArgs e) Response.Redirect("Incidentes.aspx"); Página 5