Frage

Ich weiß nicht, was ich fehle, aber ich hinzugefügt Profileigenschaften in der Datei Web.config kann aber nicht Profil zugreifen. Item im Code oder ein neues Profil erstellen.

War es hilfreich?

Lösung

Ich hatte das gleiche Problem heute, und haben viel gelernt.

Es gibt zwei Arten von Projekten in Visual Studio - "Web Application Projects" "Web-Site Projects" und Aus Gründen, die ein Rätsel für mich, Webanwendungsprojekte sind nicht Profil verwenden. direkt ... die stark typisierte Klasse für Sie nicht auf magische Weise aus der Web.config-Datei generiert wird, so müssen Sie Ihre eigene Rolle.

Das Codebeispiel in MSDN vorausgesetzt, dass Sie werden mit einem Web-Site-Projekt, und sie sagen, nur mit <profile> Eigenschaft einen Web.config Abschnitt zu Ihrem Profile. und Partei hinzuzufügen, aber das funktioniert nicht in Webanwendungsprojekte.

Sie haben zwei Möglichkeiten, um Ihre eigene Rolle:

(1) Verwenden Sie die Web Profile Builder . Dies ist ein Brauch Werkzeug, das Sie zu Visual Studio hinzufügen, die automatisch das Profilobjekt erzeugen Sie von Ihrer Definition in Web.config müssen.

Ich entschied mich für dieses nicht zu tun, weil ich nicht meinen Code wollen auf diesem zusätzlichen Werkzeug abhängen, zu kompilieren, die Probleme für jemand anderen auf der ganzen Linie verursacht haben könnte, wenn sie versuchten, meinen Code zu bauen, ohne zu merken, dass sie gebraucht dieses Werkzeug.

(2) Machen Sie Ihre eigene Klasse, die von ProfileBase leitet sich Ihr eigenes Profil zu vertreten. Das ist einfacher, als es scheint. Hier ist ein sehr einfaches Beispiel, das ein „Fullname“ string Profilfeld fügt hinzu:

In Ihrem web.config:

<profile defaultProvider="SqlProvider" inherits="YourNamespace.AccountProfile">

<providers>
     <clear />
     <add name="SqlProvider"
          type="System.Web.Profile.SqlProfileProvider"
          connectionStringName="sqlServerMembership" />
</providers>

</profile>

in einer Datei namens AccountProfile.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Profile;
using System.Web.Security;

namespace YourNamespace
{
    public class AccountProfile : ProfileBase
    {
        static public AccountProfile CurrentUser
        {
            get { return (AccountProfile)
                         (ProfileBase.Create(Membership.GetUser().UserName)); }
        }

        public string FullName
        {
            get { return ((string)(base["FullName"])); }
            set { base["FullName"] = value; Save(); }
        }

        // add additional properties here
    }
}

Um ein Profil Wert:

AccountProfile.CurrentUser.FullName = "Snoopy";

Um einen Profilwert zu erhalten

string x = AccountProfile.CurrentUser.FullName;

Andere Tipps

Webanwendungsprojekte können immer noch die Profile Objekt verwenden, sondern nur zur Laufzeit. Der Code für es ist einfach nicht in dem Projekt selbst, sondern die Klasse von ASP.Net erzeugt und liegt zur Laufzeit.

Der einfachste Weg, um zum Objekt ist eine dynamische Art zu verwenden, wie unten gezeigt wird.

In der Datei Web.config erklären Sie die Profileigenschaften:

<profile ...
 <properties>
   <add name="GivenName"/>
   <add name="Surname"/>
 </properties>

Dann auf die Eigenschaften zuzugreifen:

dynamic profile = ProfileBase.Create(Membership.GetUser().UserName);
string s = profile.GivenName;
profile.Surname = "Smith";

Änderungen speichern Eigenschaften zum Profil:

profile.Save();

Das oben funktioniert gut, wenn Sie bequem mit dynamischen Typen sind und nicht den Mangel an Compile-Zeit dagegen Überprüfung und Intellisense.

Wenn Sie dies mit ASP.Net MVC verwenden Sie einige zusätzliche Arbeit tun, wenn Sie das dynamische Profil Objekt in den Blick, da die HTML-Hilfsmethoden passieren spielen nicht gut mit „Modell“ Objekte, die dynamisch sind. Sie müssen Profileigenschaften zuweisen, um typisierte Variablen statisch, bevor sie in HTML-Hilfsmethoden übergeben.

// model is of type dynamic and was passed in from the controller
@Html.TextBox("Surname", model.Surname) <-- this breaks

@{ string sn = model.Surname; }
@Html.TextBox("Surname", sn); <-- will work

Wenn Sie eine benutzerdefinierte Profilklasse erstellen, wie Joel oben beschrieben, ASP.Net wird nach wie vor die Profile Klasse generieren, aber es wird von Ihrer benutzerdefinierten Profil Klasse erbt. Wenn Sie eine benutzerdefinierte Profilklasse angeben werden Profile von System.Web.Profile.ProfileBase erben.

Wenn Sie Ihre eigene Profilklasse erstellen stellen Sie sicher, dass Sie keine Profileigenschaften in der Datei Web.config angeben, die Sie bereits in Ihrer benutzerdefinierten Profil Klasse deklariert haben. Wenn Sie ASP.Net tun einem Compiler-Fehler geben, wenn es die Profile Klasse zu erzeugen versucht.

Profil kann auch in Webanwendungsprojekte verwendet werden. Die Eigenschaften können in Web.config zur Entwurfszeit oder programmatisch definiert werden. In Web.config:

<profile enabled="true" automaticSaveEnabled="true" defaultProvider="AspNetSqlProfileProvider">
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="TestRolesNProfiles"/>
      </providers>
      <properties>
        <add name="FirstName"/>
        <add name="LastName"/>
        <add name ="Street"/>
        <add name="Address2"/>
        <add name="City"/>
        <add name="ZIP"/>
        <add name="HomePhone"/>
        <add name="MobilePhone"/>
        <add name="DOB"/>

      </properties>
    </profile>

oder programmatisch, erstellen Sie den Profilschnitt durch Instanziieren a Profile und die Schaffung von individuellen Eigenschaften mit ProfilePropertySettings und ProfilePropertySettingsColletion , von denen alle im System ist, .Web.Configuration Namespace. Um diese Eigenschaften des Profils zu verwenden, verwenden System.Web.Profile.ProfileBase Objekte. Die Profileigenschaften können nicht mit Profil zugegriffen werden. Syntax wie oben erwähnt, kann aber leicht durch Instanziieren eine Profile und mit erfolgen SetPropertyValue ( " Propertyname ") und GetPropertyValue {" Propertyname ") wie folgt:

ProfileBase curProfile = ProfileBase.Create("MyName");

oder das Profil des aktuellen Benutzers zuzugreifen:

ProfileBase curProfile = ProfileBase.Create(System.Web.Security.Membership.GetUser().UserName);



        curProfile.SetPropertyValue("FirstName", this.txtName.Text);
        curProfile.SetPropertyValue("LastName", this.txtLname.Text);
        curProfile.SetPropertyValue("Street", this.txtStreet.Text);
        curProfile.SetPropertyValue("Address2", this.txtAdd2.Text);
        curProfile.SetPropertyValue("ZIP", this.txtZip.Text);
        curProfile.SetPropertyValue("MobilePhone", txtMphone.Text);
        curProfile.SetPropertyValue("HomePhone", txtHphone.Text);
        curProfile.SetPropertyValue("DOB", txtDob.Text);
        curProfile.Save();

Wenn Sie ein neues Website-Projekt in Visual Studio dann das Objekt erstellen, das von Profil zurückgegeben wird (automatisch) erzeugt für Sie. Wenn Sie ein Web-Anwendung-Projekt oder ein MVC-Projekt erstellen, werden Sie Ihre eigene Rolle müssen.

Dies ist wahrscheinlich klingt schwieriger, als es ist. Sie müssen folgendes tun:

  • Erstellen Sie eine Datenbank mit aspnet_regsql.exe Dieses Tool zusammen mit der .NET-Framework installiert ist.
  • eine Klasse schreiben, die von ProfileGroupBase leitet oder den Web-Profile Builder (WPB) installieren, die die Klasse für Sie von der Definition in Web.Config erzeugen kann. Ich habe für eine Weile WPB benutzen und bis jetzt hat es getan, was von ihm erwartet wird. Wenn Sie eine Menge von Eigenschaften, WPB mit ziemlich viel Zeit sparen.
  • Stellen Sie sicher, dass die Verbindung zur Datenbank richtig in Web.Config konfiguriert ist.
  • Nun legen Sie eine Instanz Ihrer Profilklasse (im Controller)
  • erstellen
  • Sie werden wahrscheinlich die Profileigenschaftswerte in Ihren Ansichten benötigen. Ich mag das Profil Objekt zu übergeben sich entlang der Ansicht (nicht einzelne Objekte).

Wenn Sie ein Web-Anwendung-Projekt verwenden, können Sie nicht auf das Profil zugreifen Objekt zur Entwurfszeit out-of-the-box. Hier ist ein Programm, das angeblich macht es für Sie: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx . Persönlich verursacht, dass Dienstprogramm einen Fehler in meinem Projekt so endete ich mein eigenes Profil Klasse Aufrollen zu von Profilen erben. Es war nicht schwer, überhaupt zu tun.

MSDN Durchlauf eine benutzerdefinierte Klasse für die Erstellung (auch bekannt als Joels Methode):
http://msdn.microsoft.com/en-us/magazine/cc163624. aspx

Ich wurde auch durch das gleiche Problem laufen. Aber anstatt eine Klasse zu schaffen, die von Profilen erbt, benutzen ich die Httpcontext.

Geben Sie die Eigenschaften in der Datei web.config wie folgt: - ProfilePropertyWeb.config

Nun schreiben Sie den folgenden Code: -

Code Behind-Profileigenschaften

Übersetzen und den Code ausführen. Sie erhalten folgende Ausgabe: -

Output

Die Web Profile Builder gut für mich gearbeitet. Die Klasse es erzeugt hat viel mehr drin als wie von Joels Post beschrieben. Unabhängig davon, ob seine tatsächlich oder nützlich brauchte ich weiß nicht.

Wie auch immer für die Suche nach einem einfachen Weg suchen, um die Klasse zu generieren, aber keine externe Build-Tool Abhängigkeit haben wollen, können Sie immer

  • verwenden, um den Web-Profile Builder
  • Alle löschen Spur davon!
  • halten die erzeugte Profil Klasse mit

OR (nicht getestet, sondern kann nur Arbeit)

  • Erstellen einer Web- Website Projekt
  • Erstellen Sie Ihr Element
  • Snap die generierte Klasse und kopieren Sie sie in Ihre Web über Projekt Projekt

Wenn dieser zweite Ansatz ist kann die Arbeit jemand lassen Sie mich für die Zukunft wissen

Ich will nur Joel Spolsky Antwort hinzufügen

Ich implementierte seine Lösung, arbeitet brillant btw - Cudos

Für alle, die ein Benutzerprofil zu erhalten, die nicht die angemeldeten Benutzer ist ich verwendet:

web.config:

  <connectionStrings>
    <clear />
    <add name="LocalSqlConnection" connectionString="Data Source=***;Database=***;User Id=***;Password=***;Initial Catalog=***;Integrated Security=false" providerName="System.Data.SqlClient" />
  </connectionStrings>

und

<profile defaultProvider="SqlProvider" inherits="NameSpace.AccountProfile" enabled="true">
  <providers>
    <clear/>
    <add name="SqlProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="LocalSqlConnection"/>
  </providers>

Und dann meine benutzerdefinierte Klasse:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Profile;
using System.Web.Security;

namespace NameSpace
{
    public class AccountProfile : ProfileBase
    {
        static public AccountProfile CurrentUser
        {
            get
            {
                return (AccountProfile)
                 (ProfileBase.Create(Membership.GetUser().UserName));
            }
        }

        static public AccountProfile GetUser(MembershipUser User)
        {
            return (AccountProfile)
                (ProfileBase.Create(User.UserName));
        }

        /// <summary>
        /// Find user with matching barcode, if no user is found function throws exception
        /// </summary>
        /// <param name="Barcode">The barcode to compare against the user barcode</param>
        /// <returns>The AccountProfile class with matching barcode or null if the user is not found</returns>
        static public AccountProfile GetUser(string Barcode)
        {
            MembershipUserCollection muc = Membership.GetAllUsers();

            foreach (MembershipUser user in muc)
            {
                if (AccountProfile.GetUser(user).Barcode == Barcode)
                {
                    return (AccountProfile)
                        (ProfileBase.Create(user.UserName));
                }
            }
            throw new Exception("User does not exist");
        }

        public bool isOnJob
        {
            get { return (bool)(base["isOnJob"]); }
            set { base["isOnJob"] = value; Save(); }
        }

        public string Barcode
        {
            get { return (string)(base["Barcode"]); }
            set { base["Barcode"] = value; Save(); }
        }
    }
}

Funktioniert wie ein Zauber ...

Große Post,

Nur ein Hinweis auf die web.config wenn Sie nicht das Inherit Attribut in dem Profilelement angeben Sie müssen jede indiviudal Profileigenschaft im Profil angeben Element auf der web.config wie unten

 <properties>
    <clear/>
    <add name="property-name-1" />
    <add name="property-name-2" />
    ..........

 </properties>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top