Implementieren des Profilanbieters in ASP.NET MVC

Für das Leben von mir kann ich den SqlProfileProvider nicht dazu bringen, in einem MVC-Projekt zu arbeiten, an dem ich arbeite.

Das erste Interessante, was mir bewusst wurde, ist, dass Visual Studio nicht automatisch die ProfileCommon-Proxyklasse für Sie generiert. Das ist keine große Sache, da es eine Frage der Erweiterung der ProfileBase-Klasse ist. Nach dem Erstellen einer ProfileCommon-Klasse habe ich die folgende Aktionsmethode zum Erstellen des Benutzerprofils geschrieben.

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

Das Problem, das ich habe, ist, dass der Aufruf von ProfileCommon.Create() nicht zum Typ ProfileCommon gecastet werden kann, sodass ich mein Profilobjekt nicht zurückbekommen kann, was offensichtlich dazu führt, dass die nächste Zeile fehlschlägt, da das Profil null ist.

Im Folgenden ist ein Ausschnitt meiner 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>

Der MembershipProvider funktioniert problemlos, so dass ich weiß, dass die Verbindungszeichenfolge gut ist.

Nur für den Fall, dass es hilfreich ist, hier ist meine ProfileCommon-Klasse:

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

Irgendwelche Gedanken darüber, was ich falsch machen könnte? Haben Sie einen ProfileProvider erfolgreich in Ihre ASP.NET MVC-Projekte integriert?

Vielen Dank im Voraus...

Antwort auf "Implementieren des Profilanbieters in ASP.NET MVC " 4 von antworten

Nicht sicher über die ganze Frage, aber eine Sache, die ich in Ihrem Code bemerkt:

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

Sie brauchen nicht sowohl die (ProfileCommon) und die als ProfileCommon. Beide machen Umwandlungen, aber die () wirft und Ausnahme, während die as gibt eine NULL, wenn die Umwandlung nicht gemacht werden kann.

Versuchen Sie Web Profile Builder. It's a build script that automagically generates a WebProfile class (equivalent to ProfileCommon) from web.config. . Es ist ein Buildskript, das automatisch eine WebProfile-Klasse (entspricht ProfileCommon) aus web.config generiert.

Die Datei web.config in der MVC Beta ist falsch. Der SqlProfileProvider befindet sich in System.Web.Profile und nicht in System.Web.Security. Ändern Sie dies, und es sollte beginnen, für Sie zu arbeiten.

Hier ist, was Sie tun müssen:

1) Im Bereich von Web.config, Fügen Sie zusätzlich zu Ihren anderen Attributeinstellungen das Attribut "inherits" hinzu:

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

2) Entfernen Sie den gesamten Abschnitt <properties> section from Web.config, since you have already defined them in your custom ProfileCommon class and also instructed to inherit from your custom class in previous step aus Web.config, da Sie sie bereits in Ihrer benutzerdefinierten ProfileCommon-Klasse definiert und auch angewiesen haben, im vorherigen Schritt

3 von Ihrer benutzerdefinierten Klasse zu erben. Ändern Sie den Code Ihrer ProfileCommon.GetProfile() -Methode in

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

Hope, dies hilft.