web-dev-qa-db-fra.com

Implémentation du fournisseur de profils dans ASP.NET MVC

Pour la vie de moi, je ne peux pas faire fonctionner le SqlProfileProvider dans un projet MVC sur lequel je travaille.

La première chose intéressante que j'ai réalisée est que Visual Studio ne génère pas automatiquement la classe proxy ProfileCommon pour vous. Ce n'est pas un gros problème car il s'agit simplement d'étendre la classe ProfileBase. Après avoir créé une classe ProfileCommon, j'ai écrit la méthode Action suivante pour créer le profil utilisateur.

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

Le problème que je rencontre est que l'appel à ProfileCommon.Create () ne peut pas être converti en type ProfileCommon, donc je ne suis pas en mesure de récupérer mon objet de profil, ce qui provoque évidemment l'échec de la ligne suivante car le profil est nul.

Voici un extrait de mon 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>

Le MembershipProvider fonctionne sans accroc, donc je sais que la chaîne de connexion est bonne.

Juste au cas où cela serait utile, voici ma 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)));
        }
    }

Des pensées sur ce que je pourrais faire de mal? Avez-vous réussi à intégrer un ProfileProvider à vos projets ASP.NET MVC?

Merci d'avance...

63
senfo

Voici ce que vous devez faire:

1) Dans la section Web.config, ajoutez l'attribut "hérite" en plus de vos autres paramètres d'attribut:

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

2) Retirez tout <properties> section de Web.config, car vous les avez déjà définis dans votre classe ProfileCommon personnalisée et vous avez également demandé d'hériter de votre classe personnalisée à l'étape précédente

3) Modifiez le code de votre méthode ProfileCommon.GetProfile () en

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

J'espère que cela t'aides.

56
Yogesh Prabhu

Essayez Web Profile Builder . Il s'agit d'un script de génération qui génère automatiquement une classe WebProfile (équivalente à ProfileCommon) à partir de web.config.

6
Dave Dunkin

Pas sûr de toute la question, mais une chose que j'ai remarquée dans votre code:

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

Vous n'avez pas besoin à la fois de (ProfileCommon) et de ProfileCommon. Ils font tous deux des transtypages, mais le () lance et une exception tandis que le as renvoie un null si le transtypage ne peut pas être effectué.

6
Mladen Mihajlovic

Le fichier web.config dans la version bêta de MVC est incorrect. Le SqlProfileProvider se trouve dans System.Web.Profile, pas System.Web.Security. Modifiez cela et cela devrait commencer à fonctionner pour vous.

1
Steve Andrews