español - Implementación de proveedor de perfiles en ASP.NET MVC
tag helpers asp net core 2 (4)
El archivo web.config en MVC Beta es incorrecto. El SqlProfileProvider está en System.Web.Profile, no System.Web.Security. Cambie esto y debería comenzar a funcionar para usted.
Por mi vida, no puedo hacer que SqlProfileProvider trabaje en un proyecto de MVC en el que estoy trabajando.
La primera cosa interesante que me di cuenta es que Visual Studio no genera automáticamente la clase proxy de ProfileCommon para usted. Eso no es gran cosa, ya que es una simple cuestión de ampliar la clase ProfileBase. Después de crear una clase ProfileCommon, escribí el siguiente método de acción para crear el 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.Create () no se puede convertir para escribir ProfileCommon, por lo que no puedo recuperar mi objeto de perfil, lo que obviamente hace que falle la siguiente línea ya que el perfil es nulo.
Lo que sigue 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 funciona sin problemas, así que sé que la cadena de conexión es buena.
En caso de que sea útil, aquí está mi clase 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)));
}
}
¿Alguna idea de lo que podría estar haciendo mal? ¿Alguno de ustedes ha integrado con éxito un ProfileProvider con sus proyectos ASP.NET MVC?
Gracias de antemano...
Esto es lo que necesita hacer:
1) En la sección de Web.config, agregue el atributo "hereda" además de las otras configuraciones de atributos:
<profile inherits="MySite.Models.ProfileCommon" defaultProvider="....
2) Elimine toda la sección de <properties>
de Web.config, ya que ya las ha definido en su clase personalizada de ProfileCommon y también ha recibido instrucciones para heredar de su clase personalizada en el paso anterior
3) Cambie el código de su método ProfileCommon.GetProfile () a
public virtual ProfileCommon GetProfile(string username)
{
return Create(username) as ProfileCommon;
}
Espero que esto ayude.
No estoy seguro sobre toda la pregunta, pero una cosa que noté en su código:
ProfileCommon profile = (ProfileCommon)ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;
No necesita tanto el (ProfileCommon) como el ProfileCommon. Ambos hacen moldes, pero el () lanza y la excepción, mientras que el as devuelve un nulo si el lanzamiento no se puede hacer.
Pruebe Web Profile Builder . Es un script de compilación que genera automágicamente una clase de perfil web (equivalente a ProfileCommon) desde web.config.