none
Implementación de Profile Provider en ASP.NET MVC

    Debate general

  • He estado buscando información acerca de como implementar el Profile Provider en ASP.NET MVC y no he encontrado mucho al respecto. No tengo mucha experiencia implementandolo y me gustaría que se habiera este tema para hacer aporatciones a como se puede manejar este aspecto en MVC. Gracias
    jueves, 26 de noviembre de 2009 18:32

Todas las respuestas

  • Hola Jusay,

    Puedes tomar esto como ejemplo:
    http://mvcmembership.codeplex.com/

    Si te queda cualquier duda, por aqui estaremos.

    Un saludo
    jueves, 26 de noviembre de 2009 22:55
  • He estado buscando información acerca de como implementar el Profile Provider en ASP.NET MVC y no he encontrado mucho al respecto. No tengo mucha experiencia implementandolo y me gustaría que se habiera este tema para hacer aporatciones a como se puede manejar este aspecto en MVC. Gracias
    Buenas Jusay,

    He revisado el proyecto que se comentaba en el post y, tampoco le pude dedicar mucho tiempo, pero me parece que Membership Provider y Roles Provider si que está implementado pero no realizan ninguna operación con Profile Provider. La verdad es que no hay mucho en Internet al respecto.
    De todos modos, en MVC 1.0 (y en la plantilla de MVC 2 Beta que contiene los mismo archivos introductorios que en MVC 1.0) cuando creas un proyecto nuevo y carga los archivos de ejemplo en el proyecto, en el controlador AccountController está implementando MemberShip provider para registrar usuarios en la aplicación. En el web.config tiene configurada el siguiente connectionString:
    <connectionStrings>
    	<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    
    En realidad nos está creando un archivo mdf en nuestro proyecto para administrar todo el tema de usuarios, roles y perfiles. Por hacer un ejemplo. Si arrancamos el proyecto de prueba y hacemos click en LogOn , tenemos la posibilidad de registrar un usuario y generará el archivo de base de datos "aspnetdb.mdf" con la siguiente estructura:

     


    Es decir, el web.config que viene con la plantilla de MVC es un perfecto ejemplo para poder manejar este tipo de datos dentro de nuestra aplicación.

    		<profile>
    			<providers>
    				<clear/>
    				<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" applicationName="/"/>
    			</providers>
    			<properties>
    				<add name="location" type="System.String"/>				
    			</properties>
    		</profile>


    Cuando yo creo un usuario, podría hacer lo siguiente:

    AccountController.cs

            [AcceptVerbs(HttpVerbs.Post)]
            public ActionResult Register(string userName, string email, string password, string confirmPassword)
            {
    
                ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
    
                if (ValidateRegistration(userName, email, password, confirmPassword))
                {
                    // Attempt to register the user
                    MembershipCreateStatus createStatus = MembershipService.CreateUser(userName, password, email);
                    var profile = ProfileBase.Create(userName);
                    profile.SetPropertyValue("Location", "Madrid");
                    profile.Save();
                    
                    if (createStatus == MembershipCreateStatus.Success)
                    {
                        FormsAuth.SignIn(userName, false /* createPersistentCookie */);
                        return RedirectToAction("Index", "Home");
                    }
                    else
                    {
                        ModelState.AddModelError("_FORM", ErrorCodeToString(createStatus));
                    }
                }
    
                // If we got this far, something failed, redisplay form
                return View();
            }


    De tal manera que, cuando ese usuario vuelva a logarse, podríamos recuperar la localización del mismo utilizando HttpContext. Por ejemplo:

    using System.Web.Mvc;
    
    namespace ProfileProviderMVC.Controllers
    {
        [HandleError]
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                ViewData["Message"] = "El usuario " + HttpContext.User.Identity.Name + " vive en " + HttpContext.Profile.GetPropertyValue("location");
    
                return View();
            }
    
            public ActionResult About()
            {
                return View();
            }
        }
    }
    


    Si lo que realmente quieres es modificar el comportamiento, generar tu propio Provider para los perfiles etcétera, deberías crear una clase que implemente de System.Web.Profile.ProfileProvider y modificar el web.config para modificar el provider por defecto y especificar el connection String para la base de datos en cuestión.

    Es un ejemplo muy sencillo, pero espero que pueda ayudarte a encaminarlo =)

    ¡Saludos!
    • Editado 0GiS0 viernes, 27 de noviembre de 2009 12:03 Mejorar visualización del código
    viernes, 27 de noviembre de 2009 12:01
  • Gracias Alfredo. Como comenta El Bruno el link del MVCMembership es bastante útil, pero se queda solo en el Membershiop Provider y el Role Provider, como comenta 0GiS0.

    Lo que no me queda claro es como debería estructurarse la implementación del Profile Provider para un proyecto MVC. El cómo implementa
    el Membership Provider y el Role Provider en el proyecto de MVCMembership, me dá una guía de cómo se puede implementar el Profile Provider. Pero aun sigo haciendo pruebas para dejar algo suficientemente robusto.

    Gracias
    viernes, 27 de noviembre de 2009 13:55
  • Gracias. Exactamente la intención es abundar mas acerca del Profile Provider en específico.

    Estoy haciendo una implemntación con una clase derivada del ProfileBase, algo así:

    public class ProfileCommon : ProfileBase
       {
           
            public virtual ProfileCommon GetProfile(string username)
            {
                return Create(username) as ProfileCommon;
            }


            public virtual string Nombre
            {
                get
                {
                    return ((string)(this.GetPropertyValue("Nombre")));
                }
                set
                {
                    this.SetPropertyValue("Nombre", value);
                }
            }

            public virtual string ApellidoPaterno
            {
                get
                {
                    return ((string)(this.GetPropertyValue("ApellidoPaterno")));
                }
                set
                {
                    this.SetPropertyValue("ApellidoPaterno", value);
                }
            }

            public virtual string ApellidoMaterno
            {
                get
                {
                    return ((string)(this.GetPropertyValue("ApellidoMaterno")));
                }
                set
                {
                    this.SetPropertyValue("ApellidoMaterno", value);
                }
            }

        }

    Esto del lado del controlador, lo utilizo creando una instancia ya con el usuario identificado:

    ProfileCommon profile = ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;

    Ya con el obejto profile creado, puedo manipular sus propiedades. Pero no he avanzado con la administración del perfil en vistas, que en teoria ya no me falta tanto, pero aun no me siento seguro de que esta sea la mejor manera. De momento funciona.

    Les dejo las ligas de donde saque el ejemplo.

    http://stackoverflow.com/questions/79129/implementing-profile-provider-in-asp-net-mvc
    http://stackoverflow.com/questions/834166/implementing-custom-profile-provider-in-asp-net-mvc


    viernes, 27 de noviembre de 2009 14:03
  • Si te he entendido bien, las dudas que te quedan son mas bien acerca del profile provider, que de asp.net MVC?

    El Profile provider funciona exactamente igual que con webforms, asi que si le quitas el MVC a las busquedas en google, encontraras muchiiiisima información sobre ello, artículos, videos...

    Por ejemplo aqui tienes una serie de 17 artículos, que hablan sobre el membership, los roles y el profile:
    http://www.4guysfromrolla.com/articles/120705-1.aspx

    y un video:
    http://www.bestechvideos.com/2009/04/07/asp-net-how-do-i-create-a-custom-profile-provider

    Yo no lo he probado, pero en el primer link que pasas, en un comentario hablan de Web Profile Builder, tiene buena pinta, te lo has mirado? (si es asi cuentanos que tal ^^)

    Por lo demas seria hacer algo parecido a lo que sale en el starter kit con el membership y el rol provider.

    Cuentanos como va!

    Un saludo y gracias a ti por estrenar el foro! :)
    viernes, 27 de noviembre de 2009 15:49