Question

Pour ma vie, je ne peux pas faire en sorte que SqlProfileProvider travaille 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 de proxy ProfileCommon pour vous. Ce n'est pas grave 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 transtyper en tant que type ProfileCommon. Je ne suis donc pas en mesure de récupérer mon objet profile, ce qui entraîne évidemment l'échec de la ligne suivante, car profile 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>

MembershipProvider fonctionne sans problème, donc je sais que la chaîne de connexion est bonne.

Au cas où cela vous aiderait, 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)));
        }
    }

Avez-vous des idées sur ce que je pourrais mal faire? Avez-vous déjà intégré avec succès ProfileProvider à vos projets ASP.NET MVC?

Merci d'avance ...

Était-ce utile?

La solution

Voici ce que vous devez faire:

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

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

2) Supprimez l'intégralité de la section <properties> de Web.config, car vous les avez déjà définies dans votre classe ProfileCommon personnalisée et vous avez également demandé à 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 vous aidera.

Autres conseils

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 lancers, mais le () jette et exception tandis que le comme renvoie un null si le trans est impossible.

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top