Página de inicio según rol de usuario

Cuando se desarrollan aplicaciones con manejo de roles significa que hay opciones a las cuáles no puede ingresar cualquier usuario, por lo tanto, según el rol se habilitan o deshabilitan funcionalidades del sistema. En algunos sistemas, un usuario puede tener más de un rol, y en otros solamente uno. Si utilizamos el MembershipProvider que nos ofrece por defecto Asp.NET tendremos la opción de agregar n roles a un usuario.

Al crear un nuevo proyecto Asp.NET MVC se configura por defecto el SqlMembershipProvider, el cual no nos brinda una función para determinar el rol (o roles) del usuario al momento de hacer el LogOn. Por lo tanto, la mejor solución es la siguiente:

  • Modificar el post del ActionResult LogOn en el AccountController, de manera que no se envíe al usuario al Home/Index.

     

     

  • Crear un RedirectController con un único ActionResult, el cual determina el rol del usuario y lo redirecciona apropiadamente.

     

     

  • Modificar el Global.asax, colocando como controlador por defecto el nuevo RedirectController.

Dado que un usuario puede tener n roles, el orden de las evaluaciones en el RedirectController es decisivo y variará según la necesidad del sistema.

De esta manera, se puede evaluar el rol del usuario que acaba de ingresar en un punto centralizado y redireccionarlo según sea necesario.

Anuncios

¿Cómo emular un Submit al seleccionar una opción de un DropDownList?

Un inconveniente con ASP.Net MVC es que no podemos utilizar la instrucción this.submit de JavaScript para emular la acción que conlleva presionar un verdadero submit, es decir, para postear un formulario es necesario presionar el input de tipo submit. Al menos en MVC 1.0 no existía un camino fácil de resolver este problema, quedará revisar con cuidado cómo se trabaja en MVC 2.0.

Probablemente, el escenario más común se presenta al querer postear un formulario cuando se selecciona una opción de un DropDownList. Para esto, la mayoría de las veces podemos utilizar el atajo que muestro a continuación:

Primero, debemos tener el previamente cargado el objeto de tipo List<SelectListItem> (para más información ver mi post anterior). Una vez listo, simplemente debemos realizar en la Vista el siguiente cambio:

 

Reemplazar esta línea:

 

<%=Html.DropDownList(“Country”, ViewData[“Countries”as List<SelectListItem>)%>

 

Por estas otras (obviamente el /Home/Details/ debe cambiarse por la acción requerida):

 

<select
onchange=”window.location=’/Home/Details/’+this.selectedIndex;” id=”Country” name=”Country”>


<%foreach (var item in ViewData[“Countries”] as
List<SelectListItem>) {%>


<option
value=”<%=item.Value%>“>
<%=item.Text%></option>


<%} %>

</select>

 

De esta manera, podemos emular el Post de un formulario, sin necesidad de crear el Form como tal, ya que solamente necesitamos el valor del elemento seleccionado en el DropDownList.

Llenando un DropDownList en MVC

Lo que resulta una tarea bastante básica y relativamente simple en .asp y ASP.Net, puede tornarse un poco confusa en ASP.Net MVC, ya que existen muchas maneras de atacar el mismo problema. Según la solución elegida, podemos tropezar con tres problemas clásicos:

  • ¿Cómo asignar el valor en los campos Text y Value apropiadamente?
  • ¿Cómo indicar qué opción del DropDownList mostrar como seleccionada en caso de ser necesario? (i.e. al momento de recordar la opción elegida al hacer un Post que no procedió)
  • ¿Cómo agregar un valor por defecto?

De las diversas opciones, en esta oportunidad vamos a enfocarnos en la que considero la mejor y más simple. A continuación muestro cómo llenar un DropDownList con información obtenida directamente de la base de datos a través de LINQ.

En el presente ejemplo vamos a cargar una lista de países, con sus respectivos ID’s, directamente de una base de datos.

En el modelo, debemos agregar la tabla países, que contendrá el nombre del país y el código a pasar como valor en el DropDownList.

En el controlador creamos un procedimiento que se encargue de llenar el DropDownList y que reciba como parámetro (opcional) el Id del país seleccionado por defecto, de la siguiente manera:

private
void FillDropDownList(int? CountryId = 0)

{


TestDataContext db = new
TestDataContext();


List<SelectListItem> Countries = new
List<SelectListItem>();

Countries.Add(new
SelectListItem() { Value = “0”, Text = “-“, Selected = false });


foreach (var country in db.Countries)

Countries.Add(new
SelectListItem()

{

Value = country.CountryId.ToString(),

Text = country.CountryName.ToString(),

Selected = CountryId == country.CountryId ? true : false

});

ViewData[“Countries”] = Countries;

}

En la vista, basta con escribir la siguiente línea donde sea necesaria:

<%=Html.DropDownList(“Country”, ViewData[“Countries”] as
List<SelectListItem>)%>

El resultado que obtendríamos al invocar FillDropDownList sin especificar el país sería el siguiente:

El resultado que obtendríamos al invocar FillDropDownList pasando el valor 3 como CountryId, sería el siguiente:

Así, se logra resolver el problema de una manera elegante, eficiente y concisa.

Cómo publicar una aplicación en ASP.Net MVC bajo IIS6

Publicar una aplicación desarrollada en ASP.Net MVC (bien sea 1.0 ó 2.0) bajo Internet Information Services 6.0 suele acarrear error del tipo 404 al intentar navegarla:

 

Solucionar esto es simple, es necesario asignar la extensión para la aplicación (Application extensión mapping) en este caso la extensión sería obviamente .mvc.

Se debe acceder al administrador de IIS6 y examinar las propiedades de la aplicación correspondiente. En la pestaña de Directorio Virtual, es necesario presionar el botón Configuración.

 

Luego, es necesario insertar un mapa de aplicación de comodines.

`

 

Una vez presionado Insertar se despliega la siguiente pantalla:

 

En la opción ejecutable debemos colocar: \WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll, que corresponde al directorio de la DLL aspnet_isapi.dll y por último deseleccionar la opción “comprobar si el archivo existe”.

Una vez hecho esto la aplicación debe correr sin problema o, en el peor de los casos, mostrar cualquier error propio que pudiera tener el sistema.

Para mayor información sobre otras versiones de IIS, recomiendo visitar el siguiente link http://www.asp.net/learn/mvc/tutorial-08-cs.aspx

Bienvenid@s a mi Blog

Es un verdadero placer el poder comenzar este Blog, que desde hace mucho tiempo quería crear para compartir las experiencias más notables adquiridas en cuanto al desarrollo de sistemas utilizando la tecnología ASP.Net de Microsoft.

Espero poder cumplir el compromiso auto-impuesto de hacer al menos una publicación semanal, y lo que es más importante aún, que las experiencias compartidas sean de interés y ayuda a la mayor cantidad de público posible.

En aras de mejorar progresivamente y poder lograr interactividad es pos de un mejor aprovechamiento del Blog, mucho sabré agradecer todos los comentarios que me hagan llegar en cualquier publicación futura.