viernes, 7 de octubre de 2011

Simple ABM (CRUD) de una tabla con WebMatrix

En el siguiente post se detallara como armar un ABM (pantallas de alta, baja y modificación) de una tabla simple (en este caso la tabla de provincias) utilizando JQuery en la plataforma WebMatrix.
El resultado sera algo como esto:


Vista de datos




Agregar nuevo dato


Modificar Dato


Lo primero que debemos hacer es descargar JQuery UI (en este ejemplo utilizaremos la versión 1.8.4)

Este ejemplo esta armado sobre una tabla de provincias llamada Provincias con  los siguientes campos:
  • ProvinciaId
  • Nombre

En el HEAD del archivo _SiteLayout.cshtml debemos agregar las siguientes lineas para referenciar a JQuery

<link type="text/css" href="@Href("~/Styles/jquery-ui-1.8.4.custom.css")" rel="stylesheet" />
        <link type="text/css" href="@Href("~/Styles/Site.css")" rel="stylesheet" />
        <script type="text/javascript" src="@Href("~/Scripts/jquery-1.4.2.min.js")"></script>
        <script type="text/javascript" src="@Href("~/Scripts/jquery-ui-1.8.4.custom.min.js")"></script>


Para armar el ABM utilizaremos:
  • Una página “maestra” de provincias, que incluirá una vista parcial (partial view) con la grilla de las provincias y un botón para crear un nuevo elemento.
  • La vista parcial: es la encargada de leer la tabla de provincias y mostrarla. Además mostrara los links de editar y eliminar.
  • Métodos de tratamiento de datos. Son tres páginas CSHTML que solo contienen código para procesar diferentes solicitudes:
    • Agregar nievo elemento.
    • Modificar un elemento.
    • Eliminar un elemento.
Archivos:
Método de alta de provincias AgregarProvincia.cshtml
@{
    bool bOk = true;
    string sError = "";
    var url = Request.Url.ToString();
    if (url.Contains("?Nombre"))
    {
        var db = Database.Open("database");
        string nombre = url.Substring(url.IndexOf('?') + 8);
        if (nombre != "") {
            var provincia = db.QuerySingle("SELECT * FROM Provincias WHERE Nombre like @0", nombre);
            if (provincia == null) {
                db.Execute("INSERT INTO Provincias (Nombre) VALUES (@0)", nombre);
            }
            else {
                bOk = false;
                //sError = "La provincia ya existe.";
                sError = "1";
            }
        }
        else {
            bOk = false;
            sError = "2";
        }
    }
    else {
        bOk = false;
        sError = "2";
    }

}

@if (bOk)
{
    @:<script languaje="JavaScript">location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>
} else if (sError == "1"){
    @:<script languaje="JavaScript">alert("Error: La provincia ya existe." );location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>
} else if (sError == "2") {
    @:<script languaje="JavaScript">alert("Error: Debe ingresar un nombre para la provincia." );location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>
}


Obtiene por parámetro de la url el nombre a insertar y realiza reglas de negocios antes de hacerlo. Si da algún error muestra en alert y vuelve a la página que lo llamo.


Método de edición de provincia EditarProvincia.cshtml

@{
    bool bOk = true;
    string sError = "";
    var url = Request.Url.ToString();
    if (url.Contains("?Nombre"))
    {
        var db = Database.Open("database");
  
        string nombre = Request.QueryString["Nombre"];
        string id = Request.QueryString["Id"];
  
        //nombre = nombre.Substring(0, url.IndexOf('&'));
        if (nombre != "" && id != "") {
            var provincia = db.QuerySingle("SELECT * FROM Provincias WHERE Nombre like @0", nombre);  
            if (provincia == null) {
                db.Execute("UPDATE Provincias SET Nombre = (@0) WHERE ProvinciaId = (@1)", nombre, id);
            }
            else {
                bOk = false;
                //sError = "La provincia ya existe.";
                sError = "1";
            }
        }
        else {
            bOk = false;
            sError = "2";
        }
    }
    else {
        bOk = false;
        sError = "2";
    }

}

@if (bOk)
{
    @:<script languaje="JavaScript">location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>
} else if (sError == "1"){
    @:<script languaje="JavaScript">alert("Error: La provincia ya existe." );location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>
} else if (sError == "2") {
    @:<script languaje="JavaScript">alert("Error: Debe ingresar un nombre para la provincia." );location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>

Obtiene por parámetro de la url el nombre y el id de la provincia a modificar y realiza reglas de negocios antes de hacerlo. Si da algún error muestra en alert y vuelve a la página que lo llamo.


Método de eliminación de provincia EliminarProvincia.cshtml

@{
    // Valida si se tiene que eliminar un registro
    var url = Request.Url.ToString(); 
    if (url.Contains("?Eliminar"))
    {
        var db = Database.Open("database");
        string id = url.Substring(url.IndexOf('?') + 10);
        db.Execute("DELETE FROM Provincias WHERE ProvinciaId = @0", id);     
    } 
}

<script languaje="JavaScript">location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>

Obtiene por parámetro de la url el id de la provincia a eliminar y si existe lo elimina. Luego vuelve a la página que lo llamo.


Partial View ProvinciasGrid.cshtml


@{
    var db = Database.Open("database");
    var selectQueryString = "SELECT * FROM Provincias";
    var data = db.Query(selectQueryString);
    var grid = new WebGrid(source: data,
                           defaultSort: "Nombre",
                           rowsPerPage: 10);
}

<fieldset>
    <legend>Listado de Provincias</legend>
    <div id="grid">
        @grid.GetHtml(tableStyle: "ui-widget ui-widget-content",
                    headerStyle : "ui-widget-header",
            columns: grid.Columns(
                    grid.Column(header: "Accionnes",
                        format:
                        @<text><a href="../../Methods/Provincias/EliminarProvincia.cshtml?Eliminar=@item.ProvinciaId">(Eliminar)</a>
                               <a href="#" onclick="mostrarEdicion('@item.ProvinciaId', '@item.Nombre')">(Editar)</a></text>),
                    grid.Column("ProvinciaId", "Id"),
                    grid.Column("Nombre", "Provincia")
            )
        )
    </div>  
</fieldset>

Básicamente lee todos los registros de la tabla de provincias y los muestra en una grilla. Además agrega dos links. Uno para eliminar, que llama al método EliminarProvincia con un parámetro que es el id de la provincia a eliminar. El otro link es el de editar y llama a una función de javascript que estará en la página principal de las provincias.


Página principal de provincias Provincias.cshtml


@{
    // Set the layout page and page title
    Layout = "~/_SiteLayout.cshtml";
    Page.Title = "Tabla de Provincias";   
}

    <script type="text/javascript">
        $(function() {
            $('#dialog-form').dialog({
                autoOpen : false,
                modal: true,
                height: 160,
        width: 475,
                buttons: {
                    'Agregar' : function(){
                        $.ajax({
                            type: "POST",
                            url: $("#add-book-form").attr('action'),
                            data: $("#add-book-form").serialize(),
                            dataType: "text/plain",
                            success: function(response) {
                                $('#dialog-form').dialog('close');
                                location.href = "../../Methods/Provincias/AgregarProvincia.cshtml?Nombre=" + $("#nombre").val();
                            },
                            error: function(response) {
                                alert(response);
                                $('#dialog-form').dialog('close');
                            }
                        });
                    },
                    Cancelar: function() {
                        $('#dialog-form').dialog('close');
    }
                }
            });
                   
            $('#dialog-form-edit').dialog({
                autoOpen : false,
                modal: true,
                height: 200,
        width: 475,
                buttons: {
                    'Aceptar' : function(){
                        $.ajax({
                            type: "POST",
                            url: $("#add-book-form").attr('action'),
                            data: $("#add-book-form").serialize(),
                            dataType: "text/plain",
                            success: function(response) {
                                $('#dialog-form').dialog('close');
                                location.href = "../../Methods/Provincias/EditarProvincia.cshtml?Nombre=" + $("#nombreEdit").val() + "&Id=" + $("#IdProv").val();
                            },
                            error: function(response) {
                                alert(response);
                                $('#dialog-form-edit').dialog('close');
                            }
                        });
                    },
                    Cancelar: function() {
                        $('#dialog-form-edit').dialog('close');
    }
                }
            });

            $('#nueva-provincia')
                .button().click(function() {
                    $('#dialog-form').dialog('open');
                });              
               
        });
       
        function mostrarEdicion(id, descripcion){
            $('#IdProv').val(id);
            $('#nombreEdit').val(descripcion);
            $('#dialog-form-edit').dialog('open');
        }
       
        </script>
   
    <div id="grid" class="ui-widget">
        @RenderPage("~/Partials/ProvinciasGrid.cshtml")
    </div>
   
    <div id="dialog-form" title="Agregar nueva provincia">
        <div class="row">
            <span class="label"><label for="nombre">Nombre:</label></span>
            <input type="text" name="nombre" id="nombre" size="40" />
        </div>
    </div>

    <div id="dialog-form-edit" title="Editar provincia">
        <div class="row">
            <span class="label"><label for="nombre">ID:</label></span>
            <input type="text" disabled="disabled" name="IdProv" id="IdProv" size="5" />
            <br/>
            <span class="label"><label for="nombre">Nombre:</label></span>
            <input type="text" name="nombreEdit" id="nombreEdit" size="40" />
        </div>
    </div>   
   
    <p><button id="nueva-provincia">Agregar nueva provincia</button></p> 


Esta página cuenta con dos div que serán las pantallas de creación y modificación de datos: dialog form y dialog form edit. Mediante JQuery se arma las respectivas pantallas y las acciones a realizar en cada una. Cada pantalla llamara al método que le corresponda, mencionado anteriormente. 


Espero que sea de ayuda. Cualquier duda pueden comentar y con gusto, si es que puedo, se las aclarare.

miércoles, 21 de septiembre de 2011

Microsoft WebMatrix



WebMatrix es una nueva herramienta de desarrollo web gratuita que hace que sea más fácil crear, personalizar y publicar un sitio web.

En WebMatrix se pueden crear aplicaciones web desde cero utilizando bases de datos y el motor de vista Razor.
Si bien el IDE de la aplicación no se compara con la herramienta Visual Studio, es bastante amigable e intuitivo, sin demasiadas opciones y fácil de usar. Tal vez el punto mas flojo es la falta de intelisence en el sector del código c# dentro de la pagina cshtml.

Lo mas destacado de esta herramienta es que tiene todo lo necesario para desarrollar un sitio, sin requerir grandes recursos:

  • Cuenta con IIS para poder correr el sitio.
  • Se puede administrar la base de datos.
  • Permite la edición de las paginas del sitio.

Recursos Online

La siguiante lista contiene informacion util para programadores sobre la herramienta: