Domanda

Per la vita di me, non riesco a SqlProfileProvider di lavorare in un progetto MVC su cui sto lavorando.

La prima cosa interessante che ho capito è che Visual Studio non genera automaticamente il ProfileCommon classe proxy per voi.Non è un grosso problema, dal momento che è simpy una questione di estendere il ProfileBase classe.Dopo la creazione di un ProfileCommon classe, ho scritto il seguente metodo di Azione per la creazione del profilo utente.

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

Il problema che sto avendo è che la chiamata a ProfileCommon.Create() impossibile eseguire il cast di tipo ProfileCommon, quindi non sono in grado di ottenere indietro il mio profilo oggetto, che ovviamente provoca la riga successiva a fallire dal profilo è null.

Di seguito è riportato un frammento del mio 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>

Il MembershipProvider funziona senza intoppi, quindi so che la stringa di connessione è buona.

Solo nel caso in cui è utile, qui è il mio 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)));
        }
    }

Ogni pensiero su quello che potrebbe essere sbagliato?Dispone di uno qualsiasi di il resto di voi integrato con successo un ProfileProvider con i tuoi ASP.NET progetti di MVC?

Vi ringrazio in anticipo...

È stato utile?

Soluzione

Ecco cosa devi fare:

1) Nel Web.config sezione, aggiungere "eredita", attributo, oltre agli altri attributo impostazioni:

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

2) Rimuovere tutta la <properties> la sezione Web.config, dal momento che sono già stati definiti in personalizzato ProfileCommon classe e anche incaricato di ereditare dalla classe personalizzata nel passaggio precedente

3) Modificare il codice del tuo ProfileCommon.GetProfile() metodo per

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

Spero che questo aiuta.

Altri suggerimenti

Non sono sicuro di tutta la questione, ma una cosa che ho notato nel tuo codice:

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

Non è necessario che entrambi i (ProfileCommon) e ProfileCommon.Entrambi fanno cast, ma il () genera una eccezione, mentre il come restituisce null se il cast non può essere fatta.

Provare Profilo Web Builder.E ' una build script che automaticamente genera un WebProfile classe (equivalente a ProfileCommon) dal web.config.

Web.file di configurazione in MVC Beta è sbagliato.Il SqlProfileProvider è nel Sistema.Web.Profilo, non del Sistema.Web.Di sicurezza.Cambiare questo, e si dovrebbe iniziare a lavorare per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top