it-swarm-pt.tech

Implementando o provedor de perfis no ASP.NET MVC

Durante toda a minha vida, não consigo fazer com que o SqlProfileProvider funcione em um projeto MVC no qual estou trabalhando.

A primeira coisa interessante que percebi é que o Visual Studio não gera automaticamente a classe de proxy ProfileCommon para você. Isso não é grande coisa, pois é apenas uma questão de estender a classe ProfileBase. Depois de criar uma classe ProfileCommon, escrevi o seguinte método Action para criar o perfil do usuário.

[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"); 
}

O problema que estou enfrentando é que a chamada para ProfileCommon.Create () não pode ser convertida para digitar ProfileCommon, portanto, não consigo recuperar meu objeto de perfil, o que obviamente faz com que a próxima linha falhe, pois o perfil é nulo.

A seguir está um trecho do meu 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>

O MembershipProvider está funcionando sem problemas, então eu sei que a cadeia de conexão é boa.

Caso seja útil, aqui está minha classe ProfileCommon:

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)));
        }
    }

Alguma idéia do que eu poderia estar fazendo de errado? Algum de vocês integrou com êxito um ProfileProvider aos seus projetos do ASP.NET MVC?

Agradeço antecipadamente...

63
senfo

Aqui está o que você precisa fazer:

1) Na seção Web.config, adicione o atributo "herda" além das outras configurações de atributo:

<profile inherits="MySite.Models.ProfileCommon" defaultProvider="....

2) Remova todo <properties> seção do Web.config, já que você já os definiu na classe ProfileCommon customizada e também instruiu a herdar da classe customizada na etapa anterior

3) Altere o código do seu método ProfileCommon.GetProfile () para

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

Espero que isto ajude.

56
Yogesh Prabhu

Tente Construtor de perfis da web . É um script de construção que gera automaticamente uma classe WebProfile (equivalente a ProfileCommon) a partir do web.config.

6
Dave Dunkin

Não tenho certeza sobre toda a pergunta, mas uma coisa que notei no seu código:

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

Você não precisa do (ProfileCommon) e do como ProfileCommon. Ambos lançam, mas o () joga e exceção, enquanto o as retorna um nulo se o elenco não puder ser feito.

6
Mladen Mihajlovic

O arquivo web.config no MVC Beta está errado. O SqlProfileProvider está em System.Web.Profile, não System.Web.Security. Mude isso e ele deverá começar a funcionar para você.

1
Steve Andrews