63 votos

Implementar un proveedor de perfiles en ASP.NET MVC

Para la vida de mí, no puedo conseguir el SqlProfileProvider a trabajar en un proyecto de MVC que estoy trabajando.

La primera cosa interesante que me di cuenta es que Visual Studio no genera automáticamente la ProfileCommon clase de proxy para usted. Eso no es un gran problema ya que es simpy una cuestión de la ampliación de la ProfileBase clase. Después de crear un ProfileCommon clase, escribí el siguiente método de Acción para la creación del perfil de usuario.

[AcceptVerbs("POST")]
public ActionResult CreateProfile(string company, string phone, string fax, string city, string state, string zip)
{
    MembershipUser user = Membership.GetUser();
    ProfileCommon profile = ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;

    profile.Company = company;
    profile.Phone = phone;
    profile.Fax = fax;
    profile.City = city;
    profile.State = state;
    profile.Zip = zip;
    profile.Save();

    return RedirectToAction("Index", "Account"); 
}

El problema que estoy teniendo es que la llamada a ProfileCommon.Crear() no puede emitir a tipo ProfileCommon, por lo que no soy capaz de volver en mi perfil de objeto, lo que obviamente hace que la línea siguiente a fallar ya que el perfil es null.

Siguiente es un fragmento de mi web.config:

<profile defaultProvider="AspNetSqlProfileProvider" automaticSaveEnabled="false" enabled="true">
    <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="FirstName" type="string" />
        <add name="LastName" type="string" />
        <add name="Company" type="string" />
        <add name="Phone" type="string" />
        <add name="Fax" type="string" />
        <add name="City" type="string" />
        <add name="State" type="string" />
        <add name="Zip" type="string" />
        <add name="Email" type="string" >
    </properties>
</profile>

El MembershipProvider está funcionando sin problemas, así que sé que la cadena de conexión es buena. Sólo en caso de que sea útil, aquí está mi ProfileCommon clase:

public class ProfileCommon : ProfileBase
    {
        public virtual string Company
        {
            get
            {
                return ((string)(this.GetPropertyValue("Company")));
            }
            set
            {
                this.SetPropertyValue("Company", value);
            }
        }

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

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

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

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

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

        public virtual ProfileCommon GetProfile(string username)
        {
            return ((ProfileCommon)(ProfileBase.Create(username)));
        }
    }

Alguna idea sobre qué podría estar haciendo mal? Tiene alguno de los demás integrado con éxito un ProfileProvider con su ASP.NET MVC proyectos?

Gracias de antemano...

6voto

Mladen Mihajlovic Puntos 2476

No estoy seguro sobre el asunto, pero lo que me di cuenta en el código:

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

No es necesario el (ProfileCommon) tanto como ProfileCommon. Ambos hacen moldes, pero (la) lanza y excepción mientras los devuelve un valor nulo si no se puede hacer el reparto.

6voto

Dave Dunkin Puntos 984

Prueba Web Builder de perfil. Es un script de compilación que automágicamente genera una clase WebProfile (equivalente a ProfileCommon) de web.config.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: