miércoles, 24 de septiembre de 2014

Obtener Id URL Parameter MVC

No hay comentarios.:
En MVC es posible que necesites el Id enviado en un parámetro, este parámetro es mas confiable que obtener el valor que de pantalla ya que puede ser inseguro.


Un ejemplo de como obtenerlo en jquery.

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    <script type="text/javascript"> 
        $(document).ready(function () { 
            var id =@ViewContext.RouteData.Values["id"]; 
            alert(id); 
        }); 
    </script> 
}

Ejemplo de como se mostrara.



Ver

lunes, 1 de septiembre de 2014

ASP.NET MVC vrs RUBY On Rails vrs PHP Frameworks

1 comentario:

ASP.NET MVC 4 o Ruby On Rails o PHP Frameworks


He tenido la oportunidad de trabajar con los 3 productos, aquí mis análisis.


PHP Frameworks mvc

Bueno 

- Alojamiento fácil y economico, los hosting son mas económicos o puedes ponerlo en un linux gratuito.

- Multiplataforma: Una de las ventajas de PHP es que funciona en todas partes y en cualquier lugar, puedes programar en tu mac y publicarlo en IIS  o apache.

- Muchas alternativas, tienes cualquier cantidad de frameworks a tu elección.

- Php es muy conocido,

Malo

- Si no has trabajado con frameworks de php la curva de aprendizaje puede ser muy alta.

- Los proyectos pueden llevarte mas tiempo ya que escribes mas código,  no todos los frameworks tiene scaffolding.

- Muchos frameworks, complicada elección, no puedes elegir por popularidad por que cambia continuamente, ni por que usan tus amigos por que todos usan alguno diferente y 
todas las búsquedas que hagas en google te darán diferentes resultados, si vas elegir algún  framework php suerte con la elección que hagas, siempre dudaras si otro es mejor.

Quien lo usa?

- Facebook
- Yahoo
- Wikipedia
- Digg.com
- Sourceforge.org
- Flickr.com (yahoo)
- WordPress (CMS)
- Drupal (CMS)

Ruby On Rails

Bueno

- Ruby es un lenguaje muy limpio y conciso.

- Rails es moderno y tiene muchas facilidades, muy fácil de usar.

- Utiliza mejores practicas de programación.

- Scaffolding asegurado todo tu CRUD(Create,Read,Update,Delete) es generado solo, desde la linea de comandos)

- Muchos programadores de php se han cambiado a Rails.

- Multiplataforma: Una de las ventajas de PHP es que funciona en todas partes y en cualquier lugar, puedes programar en tu mac.

Malo

- Bajo performance, es mas rápido php.

- Ruby es poco conocido en el ámbito profesional.

- Los hosting de publicación son mas altos que los de php.

Quien lo usa?

- Amazon
- Twitter
- Cisco
- IBM
- GitHub

ASP.NET MVC 4

Bueno

- C# es un lenguaje elegante y muy utilizado, Borlan hizo un gran trabajo.

- Acceso a datos muy evolucionado y con varias alternativas Entity Framework, nhibernate,  subsonic.

- IDE Visual Studio .net es muy bueno tiene mucha auto completado (C#,css, Js) y se puede utilizar con git, tfs o sub versión.

- Buen performance ya que el código es compilado y no interpretado.

- Scaffolding grafico todo tu CRUD(Create,Read,Update,Delete) es generado solo.

- Facil de publicar su sitio(Web deploy)

Malo

- El hosting es muy caro para todo lo de Microsoft debido a su licencias.

- IDE y documentación es pagada.

- Solo corre en Microsoft, solo lo puedes publicar en tu IIS(esperamos que cambie pronto),  ósea a instalar una virtual con windows para programar en tu mac.

Quien lo usa?

- Microsoft (jajajaja logico)
- Outlook
- Copa Airlines

Aqui es un poco injusto comparar ya que Microsoft es mas corporativo aun que ha proporcionado mucho a código abierto.


Conclusiones:

He llegado a esta conclusión después de mi investigación sin embargo lo invito a realizar su propia investigación probando todos.

Rails y MVC .net son mas organizados y fuertemente estructurados a la vez de rígidos, PHP es más flexible a la vez de desordenado, el desorden complica el mantenimiento de tu código.


asp.net MVC - Fantástico IDE, fantástico lenguaje C#  Punteo: Grandioso. 

Rails - Lenguaje fantástico. Ruby es simplemente ... increíble. Punteo: Bueno 

PHP - supongo que vas a utilizar un framework PHP, puedes utilizar: CakePHP, Zend, Laravel, CodeIgniter, Symfony, Phalcon, Yii jajajaj suerte en tu elección y recuerda elijas en que elijas siempre estarás pensando que hay otro mejor. 

Punteo: No se?? que framework vas a usar? hay tantos frameworks que me confundo.



Ver

sábado, 30 de agosto de 2014

Ejemplo de Pie con mvc 4.5

No hay comentarios.:
En este ejemplo vamos a realizar una gráfica de pie.



1.) Descargar el chart.js de http://www.chartjs.org y agregarlo en la carpeta Script de tu proyecto



2.) Luego procedemos abrir cualquier  view, en mi caso utilizare /view/categories/index

Antes que inicie la tabla debes de agregar el cambas de html 5.

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 

@*Inicio del canvas de la grafica*@ 
<div id="canvas-holder"> 
    <canvas id="chart-area" width="300" height="300" /> 
</div> 

<table class="table">

3.) Ahora vamos agregar los script necesarios, en la parte de abajo de la pagina agregamos:

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    <script src="~/Scripts/Chart.js"></script> 

    <script> 

        var pieData = [ 
                { 
                    value: 300, 
                    color: "#F7464A", 
                    highlight: "#FF5A5E", 
                    label: "Red" 
                }, 
                { 
                    value: 50, 
                    color: "#46BFBD", 
                    highlight: "#5AD3D1", 
                    label: "Green" 
                }, 
                { 
                    value: 100, 
                    color: "#FDB45C", 
                    highlight: "#FFC870", 
                    label: "Yellow" 
                }, 
                { 
                    value: 40, 
                    color: "#949FB1", 
                    highlight: "#A8B3C5", 
                    label: "Grey" 
                }, 
                { 
                    value: 120, 
                    color: "#4D5360", 
                    highlight: "#616774", 
                    label: "Dark Grey" 
                } 

        ]; 

         $(document).ready(function () { 
            var ctx = document.getElementById("chart-area").getContext("2d"); 
            window.myPie = new Chart(ctx).Pie(pieData); 
        });
         
    </script> 
}



Ha este punto ya debes de tener una gráfica, como puedes ver el Json esta escrito manualmente, ahora debemos generarlo.

5.) Para generar el json abrimos el controller en mi caso sera CategoriesController.cs y agregarmos:

        public JsonResult grafica() 
        { 
             var query = from c in db.Categories 
                        select new 
                        { 
                            value = c.Products.Count(), 
                            label = c.CategoryName 
                        };        

            return Json(query, JsonRequestBehavior.AllowGet); 

        }

Podrias ver el json generado con la ruta:
/categories/grafica

6.) Ahora agregamos el llamado del lado del cliente, para esto volvemos a nuestra view de índex y cambiamos la sección de script por:

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    <script src="~/Scripts/Chart.js"></script> 

    <script> 

        $(document).ready(function () { 

            $.post( 
                 '@Url.Action("grafica", "Categories")' 
              ) 
             .done(function (data) { 
                 var ctx = document.getElementById("chart-area").getContext("2d"); 
                 window.myPie = new Chart(ctx).Pie(data); 
             }) 
             .fail(function (data) { 
                 console.log('error !!!'); 
             } 
         ); 


        }); 

    </script> 
}

Note que ya no es necesario que este escrito el json ya que lo vamos a generar.

Ahora nos mostrara nuestro pie sin colores, ya que el json generado aun no los tiene.



7.) Por ultimo vamos agregar colores al json generado, eso puede que lleve mas código ya que tenemos que tener una tabla de colores y llamarlos al momento del llenado.

Dentro del controlador vamos agregar 2 lista genéricas uno para los colores y otra para datos que enviaremos.

7.2) Lista genéricas:

 public class colores 
        { 
            private int _id; 
            private string _color;
            private string _highlight;

            public int id { get { return _id; } set { _id = value; } }
            public string color { get { return _color; } set { _color = value; } }
            public string highlight { get { return _highlight; } set { _highlight = value; } }

            public colores(int id,string color, string highlight)
            { 
                _id = id; 
                _color = color; 
                _highlight = highlight; 
            } 
        } 

        public class categorias
        { 
            private int _value;
            private string _color;
            private string _highlight;
            private string _label;


            public int value { get { return _value; } set { _value = value; } }
            public string color { get { return _color; } set { _color = value; } }
            public string highlight { get { return _highlight; } set { _highlight = value; } }
            public string label { get { return _label; } set { _label = value; } }

            public categorias(int value, string color, string highlight, string label)
            { 
                _value = value; 
                _color = color; 
                _highlight = highlight; 
                _label = label; 
            } 
        }

7.3) Ahora vamos a cambiar nuestro metodo gráfica para utilizar los colores, debemos de popular la lista de colores disponibles y luego popular las categorías, por ultimo agregarlos unir colores con categorías, ahora mismo solo vamos a trabajar con 5 colores, si las categorías son mas de 5 se van a repetir colores, si no quieres que se repitan agrega tantos colores como categorías.

public JsonResult grafica() 
        { 

            List<colores> col = new List<colores>();
            col.Add(new colores(0,"#F7464A", "#FF5A5E")); 
            col.Add(new colores(1,"#46BFBD", "#5AD3D1")); 
            col.Add(new colores(2,"#FDB45C", "#FFC870")); 
            col.Add(new colores(3,"#949FB1", "#A8B3C5")); 
            col.Add(new colores(4,"#4D5360", "#616774")); 

            var query = from c in db.Categories 
                        select new 
                        { 
                            value = c.Products.Count(), 
                            label = c.CategoryName 
                        }; 

            List<categorias> Cat = new List<categorias>(); 
            int id = 0;  
            foreach (var row in query)
            { 
                 
                colores filacolor; 
                filacolor = col[id]; 
                Cat.Add(new categorias(row.value, filacolor.color, filacolor.highlight, row.label));
                if(id==4) 
                { 
                    id = 0; 
                } 
                else 
                { 
                    id++; 
                } 
            } 

            return Json(Cat, JsonRequestBehavior.AllowGet); 

        }


Así quedara al final:



Agrego el código fuente completo.

Codigo fuente html

@model IEnumerable<WebApplication2.Models.Categories> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 

@*Inicio del canvas de la grafica*@ 
<div id="canvas-holder"> 
    <canvas id="chart-area" width="300" height="300" /> 
</div> 

<table class="table"> 
    <tr> 
        <th> 
            @Html.DisplayNameFor(model => model.CategoryName)
        </th> 
        <th> 
            @Html.DisplayNameFor(model => model.Description) 
        </th> 
        <th></th> 
    </tr> 

    @foreach (var item in Model) 
    { 
        <tr> 
            <td> 
                @Html.DisplayFor(modelItem => item.CategoryName) 
            </td> 
            <td> 
                @Html.DisplayFor(modelItem => item.Description) 
            </td> 
            <td> 
                @Html.ActionLink("Edit", "Edit", new { id = item.CategoryID }) | 
                @Html.ActionLink("Details", "Details", new { id = item.CategoryID }) | 
                @Html.ActionLink("Delete", "Delete", new { id = item.CategoryID }) 
            </td> 
        </tr> 
    } 

</table> 
@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    <script src="~/Scripts/Chart.js"></script> 

    <script> 

        $(document).ready(function () { 

            $.post( 
                 '@Url.Action("grafica", "Categories")' 
              ) 
             .done(function (data) { 
                 var ctx = document.getElementById("chart-area").getContext("2d"); 
                 window.myPie = new Chart(ctx).Pie(data); 
             }) 
             .fail(function (data) { 
                 console.log('error !!!'); 
             } 
         ); 


        }); 

    </script> 
}

Codigo fuente controlador

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Net; 
using System.Web; 
using System.Web.Mvc; 
using WebApplication2.Models; 

namespace WebApplication2.Controllers 
{ 



    public class CategoriesController : Controller
    { 
        private ApplicationDbContext db = new ApplicationDbContext();

        public class colores 
        { 
            private int _id; 
            private string _color;
            private string _highlight;

            public int id { get { return _id; } set { _id = value; } }
            public string color { get { return _color; } set { _color = value; } }
            public string highlight { get { return _highlight; } set { _highlight = value; } }

            public colores(int id,string color, string highlight)
            { 
                _id = id; 
                _color = color; 
                _highlight = highlight; 
            } 
        } 

        public class categorias
        { 
            private int _value;
            private string _color;
            private string _highlight;
            private string _label;


            public int value { get { return _value; } set { _value = value; } }
            public string color { get { return _color; } set { _color = value; } }
            public string highlight { get { return _highlight; } set { _highlight = value; } }
            public string label { get { return _label; } set { _label = value; } }

            public categorias(int value, string color, string highlight, string label)
            { 
                _value = value; 
                _color = color; 
                _highlight = highlight; 
                _label = label; 
            } 
        } 

        public JsonResult grafica() 
        { 

            List<colores> col = new List<colores>();
            col.Add(new colores(0,"#F7464A", "#FF5A5E")); 
            col.Add(new colores(1,"#46BFBD", "#5AD3D1")); 
            col.Add(new colores(2,"#FDB45C", "#FFC870")); 
            col.Add(new colores(3,"#949FB1", "#A8B3C5")); 
            col.Add(new colores(4,"#4D5360", "#616774")); 

            var query = from c in db.Categories 
                        select new 
                        { 
                            value = c.Products.Count(), 
                            label = c.CategoryName 
                        }; 

            List<categorias> Cat = new List<categorias>(); 
            int id = 0;  
            foreach (var row in query)
            { 
                 
                colores filacolor; 
                filacolor = col[id]; 
                Cat.Add(new categorias(row.value, filacolor.color, filacolor.highlight, row.label));
                if(id==4) 
                { 
                    id = 0; 
                } 
                else 
                { 
                    id++; 
                } 
            } 

            return Json(Cat, JsonRequestBehavior.AllowGet); 

        } 


        // GET: Categories 
        public ActionResult Index() 
        { 
            return View(db.Categories.ToList()); 
        } 


Ver

miércoles, 27 de agosto de 2014

Http a https IIS8

No hay comentarios.:
Para hacer un redirect de http a https lo mejor es usar la extensión  Rewrite Module, la extensión la tenemos que instalar, puedes bajarlo de:

http://www.iis.net/downloads/microsoft/url-rewrite

Luego cambian en el webconfig  en la sección de < system .webserver>


 <system.webServer>  
<rewrite> 
      <rules> 
         <rule name="http to https" stopProcessing="true"> 
                    <match url=".*" /> 
                    <conditions> 
                        <add input="{HTTPS}" pattern="off" /> 
                    </conditions> 
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:0}" /> 
        </rule> 
      </rules> 
 </rewrite> 

</system.webServer>
Ver

sábado, 26 de julio de 2014

Seguridad con MVC 5 (Identity)

6 comentarios:
Guia Rapida de Membership en MVC4.

En MVC 4 es muy fácil utilizar esta herramienta, siga los siguientes pasos para ver un ejemplo practico.

1.) Cree un nuevo proyecto, 
        File --> New proyect
        Archivo - Nuevo Proyecto





2.)Luego seleccione la plantilla "MVC" 





3.) Abra su archivo web config y configure correctamente la información de su connection String para "DefaultConnection"





El web config debe quedar de la siguiente manera, recuerde que debe configurar acorde a su equipo.


  <connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=localhost; 
            Initial Catalog=northwind;user id=sa;password=P@ssw0rd" providerName="System.Data.SqlClient" /> 
  </connectionStrings>

Vamos a ver una imagen de la base de datos antes de crear nuestro primer usuario.




4.) Ahora vamos a crear nuestro primer usuario, para esto debemos ejecutar nuestro proyecto.

Precione F5 para ejecutar el proyecto 




Creer 2 usuarios, administrador y user1, esto nos será de utilidad para los próximos pasos.

Si todo esta correcto debería haber creado las tablas:


AspNetUsers    --  Catalogo de usuarios
AspNetRoles    -Catalogo de Roles
AspNetUserRoles   -- Catalogo Usuarios por roles
AspNetUserClaims - Almacena información acerca de los inicios de sesión de terceros, almacenará el nombre del proveedor (digamos Facebook, Google, Live) la identificación del proveedor y la identificación de usuario. El ID de usuario es normalmente un símbolo para identificar a cada usuario.




5.) Agregando Roles, Para agregar roles en muy facil solo hacemos un insert en la tabla webpages_Roles.

INSERT INTO [dbo].[AspNetRoles]
(id,Name)
VALUES
 (1,'administradores')
        

6.) Ahora vamos agregar usuario "administrador" a nuestro rol "Administradores", Pero primero debemos saber que id tiene nuestro usuario, para esto ejecutamos:





Ahora ejecutamos:
Ya que el id es muy largo utilizaremos el query para hacer mas fácil el insert.

declare @id nvarchar(128)
select @id=id    
from AspNetUsers
where UserName='adminitrator'

INSERT INTO AspNetUserRoles
([UserId]    
,[RoleId])    
VALUES    
(@id
,1)

        
5.) En MVC la seguridad se agrega en los controles, por cada acción, vamos hacer un ejemplo, en la carpeta controller habrá HomeController y pruebe con las siguientes posibilidades.


 [Authorize] 
        public ActionResult About() 
        { 
            return View(); 
        } 

[Authorize(Roles = "administradores")] 
        public ActionResult About() 
        { 
            return View(); 
        } 

[Authorize(Users="user1")] 
        public ActionResult About() 
        { 
            return View(); 
        }

Authorize: Permitira todos los usuarios ya autenticados.
Authorize Roles: Solo los roles autorizados en este ejemplo: Administradores
Authorize Users: Solo los usuarios autorizados en este ejemplo: User1

Nota:
Si quieren verificar un role desde Razor.

if (User.IsInRole("rolename")) {
// my action

}


Ver

lunes, 23 de junio de 2014

Jquery Obtener Elementos por Value

No hay comentarios.:
Si quieres usar jquery con un formulario que no usa id para identificar los elementos, es posible que tengas algunos problemas.

Si tiene solo name puedes hacer lo siguiente:

<form> 
     <input type="text" name='xx' value="test"> 
</form> 

<script> 
$(document).ready(function() { 

    var algo=$("input[name=xx]").val(); 
            alert(algo); 

}); 
</script>
Por valor:
<form> 
     <input type="button" value="Delete"> 
</form> 

<script> 
$(document).ready(function() { 

    var algo=$("input[type=button][value=Delete]").val();
    alert(algo); 

}); 
</script>

Si tienes NO tienes name puedes hacer la búsqueda por value, si tienes varios elementos puedes hacer each, en este ejemplo se ocultan los elementos con el mismo value.

<form> 
        <input type="button" class="" style=""  value="Delete"> 
        <input type="button" class="" style=""  value="edit"> 
        <input type="button"class="" style=""  value="Delete"> 
        <input type="button" class="" style=""  value="Delete"> 
</form> 

<script> 
$('input[type=button]').each(function() { 
    var btn= $(this); 
    if(btn.val()=='Delete') 
    { 
        btn.hide(); 
    }             
}); 
</script>
Ver

jueves, 19 de junio de 2014

MVC 5 Modelos

No hay comentarios.:

1.) Vamos a crear un nuevo proyecto File--> New Project ..




2.) Seleccionamos Visual c# --> Web



3.) Ahora debemos seleccionar el template, selecciona MVC



4.) Lo primero es cambiar la configuración de conexión de base de datos llamada  "DefaultConnection" ubicada en Web. config.

Actual:

 <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication2-20140608113405.mdf;Initial Catalog=aspnet-WebApplication2-20140608113405;Integrated Security=True"
      providerName="System.Data.SqlClient" />

Cambiar por: (recuerde cambiar sus credenciales, nombre de base datos y servidor)

<add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Northwind;user id=sa;password=P@ssw0rd" providerName="System.Data.SqlClient" />

Datasource = Servidor donde se ubica la base de datos
Inicial Catalog= Base de datos
User id= usuario de base de datos
Password = Contraseña del usuario de base de datos.

5.) Ahora vamos a crear los modelos, los modelos no son mas que clases con los campos de las tablas como propiedades.

Presione clic derecho sobre la carpeta de "Models" y agregar "Class"



Ahora seleccione Class, agregue el nombre de clase que va crear Ejemplo "Categories", "Products".



Asegurase que las siguientes librerías estén disponibles para todas las clases.

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

5.1) Modelo de "Categories" (Categorias), ahora agregue el siguiente código.



 public partial class Categories
    {    
       [Key]
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
        public string Description { get; set; }

        public virtual ICollection<Products> Products { get; set; }
    }


5.2) Modelo de "Supplier" (Proveedores) tiene muchos mas campos que el modelo anterior así que podemos solo agregar las propiedades que vamos a necesitar. Agregue el siguiente código.

public partial class Suppliers
    {   
       [Key]
        public int SupplierID { get; set; }
        public string CompanyName { get; set; }

        public virtual ICollection<Products> Products { get; set; }
    }

Nota:
Con public virtual mostrara que tiene error hasta que termine el punto 5.3

5.3) Modelo de "Products", por ultimo vamos hacer el Productos, este modelo vamos agregar validaciones e información de el display.

 public partial class Products
 {   
        [Key]
        public int ProductID { get; set; }

        [Display(Name = "Nombre")]
        [Required(ErrorMessage = "Nombre de Producto Requerido")]
        [MaxLength(50)] 
        public string ProductName { get; set; }
        
        [Display(Name = "Proveedor")]
        public Nullable<int> SupplierID { get; set; }

        [Display(Name = "Categoria")] 
        public Nullable<int> CategoryID { get; set; }

        [Display(Name = "Precio")]
        [DisplayFormat(DataFormatString = "{0:c}")] 
        public Nullable<decimal> UnitPrice { get; set; }
        public Nullable<short> UnitsInStock { get; set; }
        public bool Discontinued { get; set; }

        public virtual Categories Categories { get; set; }
        public virtual Suppliers Suppliers { get; set; }

    }


6.) Vamos a configurar el contexto "ApplicationDbContext" para nuestra identificar nuestros modelos y evitar que pluralice o singularice los nombre de las tablas.






6.1) En la carpeta modelos abra el archivo "IdentityModels" y en la sección de "ApplicationDbContext" Agregue lo siguiente:



public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            base.OnModelCreating(modelBuilder);
        }

        public DbSet<Models.Categories> Categories { get; set; }
        public DbSet<Models.Suppliers> Suppliers { get; set; }
        public DbSet<Models.Products> Products { get; set; }

    }

Nota:
Los siguiente using son necesarios, para el código anterior.

using Microsoft.AspNet.Identity.EntityFramework;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

7.) Ahora vamos a compilar para que el proyecto pueda ver los modelos.

7.1) Clic derecho sobre el proyecto y luego en el menú clic en "Build"




8.) Vamos a crear los modelos y vistas utilizando scaffolding.

8.1) Clic derecho sobre la carpeta "Controllers" --> Add --> Controller...



8.2) Se mostrara la ventana de scaffolding



8.3) Se mostrara la ventana de add controller, en esta parte debemos indicar el modelo y el contexto.




9.) Listos para ver nuestro nuevo proyecto.




Ver

martes, 29 de abril de 2014

First Sequence contains no elements

No hay comentarios.:
En linq cuando quieres que la consulta retorne 1 solo resultado usas firts Ejemplo:

  var query = (from c in db.customers 
               where c.customerid == 1 
               select c).ToList().First();


El problema es que si la consulta no retorna ninguna nada dará un error:

Sequence contains no elements

Soluciones:

1.) Puedes agregar un try and catch (Mala idea)

try 
{ 
    var query = (from c in db.customers 
                         where c.customerid == 1 
                         select c).ToList().First(); } 
catch (Exception) 
 {                      
      throw; 
 }  



2.) Puedes cambiar tu "First" por un "FirstOrDefault" cuando la consulta no tenga registros dejara la variable query como nulo y no dará error.



  var query = (from c in db.customers 
               where c.customerid == 1 
               select c).ToList().FirstOrDefault();
Ver

domingo, 20 de abril de 2014

ValidateAntiForgeryToken Ejemplo con Ajax

No hay comentarios.:

Propósito:

ValidateAntiForgeryToken(anti-falsificación) de MVC escribe un valor único a un solo HTTP cookie y el mismo valor se escribe en el formulario.

Cuando se envíe la página, se produce un error si el valor de la cookie no coincide con el valor de la forma.

Es importante tener en cuenta que esta función evita cross site request forgeries.

Vamos hacer un ejemplo desde el principio.


1.) Primer paso a ser un proyecto, File --> New Project



2.) Se solicitara que seleccione el tipo de proyecto, seleccione MVC.



3.) Para realizar el ejemplo, necesitamos datos, utilizaremos Entity Framework,  en la carpeta de "Model" presione clic derecho, y luego "New Item".



4.) En la sección de Data seleccione "Ado .Net Entity Data Model"



5.) Se mostrara la pantalla para que seleccione "Generate from database"



6.) Se solicitara la pantalla para que ingrese sus credenciales.




7.) Se mostrara la pantalla para seleccionar las tablas, seleccione "Categories","Products" y "Suppliers"



 Ahora vamos a crear el controlador de la tabla "Products" y generamos con Scaffold las vistas, no olvide generar el proyecto.

8.) Agregado el controller, en la carpeta "Controller" clic derecho "add new item"


9.) En la pantalla de "Add Scaffold" selecionamos "MVC 5 Controller with views using Entity Framework"



10.) En la pantalla de Add Controller complete con lo siguiente. (No olvide compilar antes), esto generar las vistas de "products"



Por fin tenemos vistas con DropDownlist para jugar, si ejecutamos el proyecto y entramos "Productos/Create" podremos ver que tiene los DropDownlist de "Categoria" y "Proveedores"


Debemos de crear los métodos que retornen json para su posterior uso.

11.)  Abra la el controllador de Productos Ubicado en Controllers, el nombre será "ProductsController" y agregue el siguiente código.


 
        [HttpPost] 
        [ValidateAntiForgeryToken] 
        public JsonResult getcategories() 
        { 
            var query = from c in db.Categories 
                        select new { c.CategoryID, c.CategoryName };

            return Json(query, JsonRequestBehavior.DenyGet); 

        } 

        [HttpPost] 
        [ValidateAntiForgeryToken] 
        public JsonResult getsuppliers() 
        { 
            var query = from s in db.Suppliers 
                        select new { s.SupplierID, s.CompanyName };

            return Json(query, JsonRequestBehavior.DenyGet); 

        }

12.)  En este mismo controlador, debemos de comentar el código de llenado de los viewbag que usan los  Dropdownlist en el método create.

public ActionResult Create() 
{ 
//ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "CategoryName"); 

//ViewBag.SupplierID = new SelectList(db.Suppliers, "SupplierID", "CompanyName"); 
 return View(); 
}

Procederemos a llenar el DropDownlist de Suppliers y Category con Json.

13.) Abra el archivo de "Create" ubicado en "View" --> "Products" --> "Create.cshtml"



Al abrir el archivo debemos de comentar los Dropdownlist de Razor y cambiarlos por select de html.

Cambia:
@Html.DropDownList("SupplierID", String.Empty)
Por:
<select name="SupplierID" id="SupplierID"> 
      <option value="">Seleccione uno...</option> 
</select> 
                 
 
Cambia:
@Html.DropDownList("CategoryID", String.Empty)
Por:
<select name="CategoryID" id="CategoryID"> 
            <option value="">Seleccione uno...</option> 
</select> 
15.) En el mismo archivo "Create.cshtml" debemos agregar el Json de llenado, busque la  sección "Script" y reemplace por los siguiente:
@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    <script> 

        $(document).ready(function () { 
            //var token = $('[name=__RequestVerificationToken]').val(); 
            load_suppliers(); 
            load_categories(); 
            
        }); 

        function load_categories() { 
            var token = $('[name=__RequestVerificationToken]').val();
            var data = { 
                __RequestVerificationToken: token 
            }; 

            $.post( 
                  '@Url.Action("getcategories", "products")', data
               ) 
              .done(function (data) { 
                  $.each(data, function (i, row) { 
                      var $option = $('<option>');
                      $option.val(row.CategoryID); 
                      $option.html(row.CategoryName); 
                      $('#CategoryID').append($option); 
                  }) 
              }) 
              .fail(function (data) { 
                  console.log('error !!!'); 
              } 
          ); 
        } 

        function load_suppliers() { 

            var token = $('[name=__RequestVerificationToken]').val();
            $.ajax({ 
                url: '@Url.Action("getsuppliers", "products")',
                data: { __RequestVerificationToken: token }, 
                type: 'POST', 
                success: function (data) { 
                    $.each(data, function (i, row) { 
                        var $option = $('<option>');
                        $option.val(row.SupplierID); 
                        $option.html(row.CompanyName); 
                        $('#SupplierID').append($option); 
                    }) 
                }, 
                error: function (msg) { 
                } 
            }); 
        } 
                 
</script>  
} 
El resultado sera:
Ver