63 votes

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

Pour la vie de moi, je ne peux pas obtenir le SqlProfileProvider de travailler dans un projet MVC que je suis en train de travailler sur.

La première chose intéressante que j'ai réalisé, c'est que Visual Studio ne génère pas automatiquement de la ProfileCommon classe proxy pour vous. Ce n'est pas une grosse affaire, puisque c'est simpy une question de l'extension de la ProfileBase classe. Après la création d'un ProfileCommon la classe, j'ai écrit une méthode d'Action pour la création de 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.Créer() ne peut pas lancer de type ProfileCommon, donc je ne suis pas en mesure de récupérer mon objet de profil, ce qui suscite évidemment la ligne suivante à l'échec puisque le profil est null.

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ù il est utile, voici mon ProfileCommon classe:

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

Toute réflexion sur ce que je fais de mal? Ont tout le reste de vous intégré avec succès un ProfileProvider avec votre ASP.NET les projets MVC?

Je vous remercie à l'avance...

6voto

Mladen Mihajlovic Points 2476

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 les deux des conversions, mais le () lance et une exception tandis que le comme renvoie une valeur null si la conversion ne peut pas être faite.

6voto

Dave Dunkin Points 984

Essayez Web Profile Builder . C'est un script de construction qui génère automatiquement une classe WebProfile (équivalente à ProfileCommon) à partir de web.config.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X