Implementando Provedor de Perfil em ASP.NET MVC
-
09-06-2019 - |
Pergunta
Durante toda a minha vida, não consigo fazer o SqlProfileProvider funcionar em um projeto MVC no qual estou trabalhando.
A primeira coisa interessante que percebi é que o Visual Studio não gera automaticamente a classe 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 tendo é que a chamada para ProfileCommon.Create() não pode ser convertida para o tipo ProfileCommon, então 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 sei que a cadeia de conexão está 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 ideia sobre o que posso estar fazendo de errado?Algum de vocês integrou com sucesso um ProfileProvider aos seus projetos ASP.NET MVC?
Agradeço antecipadamente...
Solução
Aqui está o que você precisa fazer:
1) Na seção Web.config, adicione o atributo "herda" além de suas outras configurações de atributos:
<profile inherits="MySite.Models.ProfileCommon" defaultProvider="....
2) Remova inteiro <properties>
seção do Web.config, pois você já os definiu em sua classe ProfileCommon personalizada e também instruiu a herdar de sua classe personalizada 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.
Outras dicas
Não tenho certeza sobre toda a questão, mas notei uma coisa no seu código:
ProfileCommon profile = (ProfileCommon)ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;
Você não precisa de (ProfileCommon) e de ProfileCommon.Ambos fazem conversões, mas o () lança uma exceção enquanto o as retorna um nulo se a conversão não puder ser feita.
Tentar Construtor de perfil da web.É um script de construção que gera automaticamente uma classe WebProfile (equivalente a ProfileCommon) a partir do web.config.
O arquivo web.config no MVC Beta está errado.O SqlProfileProvider está em System.Web.Profile, não em System.Web.Security.Mude isso e deve começar a funcionar para você.