Announcement

Collapse
No announcement yet.

Verwalten von Profileigenschaften

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verwalten von Profileigenschaften

    Hallo zusammen,

    ich habe ein Websiteprojekt erstellt, das mit Profileigenschaften arbeitet. Das funktioniert auch. Nun habe ich das Websiteprojekt in eine Webanwendung konvertiert und diese wie folgt angepasst:
    1. Die Klasse "ProfileCommon" als benutzerdefinierte Klasse in einer eigenen Code-Datei (.cs) angelegt, die nicht im Ordner App_Code liegt. Diese Klasse wird wohl im Websiteprojekt dynamisch zur Laufzeit generiert, in der Webanwendung jedoch nicht und muss deshalb benutzerdefiniert vorliegen.
    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Web;
    using System.Web.Profile;
    
    public class ProfileCommon
    {
        public String PostalCode
        {
            get
            {
                return (String)HttpContext.Current.Profile.GetPropertyValue("PostalCode");
            }
            set
            {
                HttpContext.Current.Profile.SetPropertyValue("PostalCode", value);
            }
        }
    }
    2. In der Default.cs sieht der Code jetzt so aus:
    Code:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    
    namespace ProfileDemoProjekt
    {
        public partial class _Default : System.Web.UI.Page
        {
            ProfileCommon Profile = new ProfileCommon();  // neue Instanz
    
            protected void Page_Load(object sender, EventArgs e)
            {
                labelPostalCode.Text = Profile.PostalCode;
            }
            protected void SetPostalCode_Click(object sender, EventArgs e)
            {
                Profile.PostalCode = Server.HtmlEncode(textPostalCode.Text);
                labelPostalCode.Text = Profile.PostalCode;
            }
        }
    }
    Beim Aufruf bekomme ich einen Kompilerungsfehler:

    Kompilierungsfehler
    Beschreibung: Fehler bei der Kompilierung einer Ressource, die zur Verarbeitung dieser Anforderung erforderlich ist. Überprüfen Sie die folgenden spezifischen Fehlerdetails, und ändern Sie den Quellcode entsprechend.

    Compilerfehlermeldung: CS0433: Der Typ ProfileCommon ist in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temp orary ASP.NET Files\root\702c2902\4acf372\assembly\dl3\413e7301\ 1eb98e6e_9953c901\ProfileDemoProjekt.DLL und c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temp orary ASP.NET Files\root\702c2902\4acf372\App_Code.d3lxxxmh.dll vorhanden.

    Quellfehler:



    Zeile 123: }
    Zeile 124:
    Zeile 125: protected ProfileCommon Profile {
    Zeile 126: get {
    Zeile 127: return ((ProfileCommon)(this.Context.Profile));


    Quelldatei: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temp orary ASP.NET Files\root\702c2902\4acf372\App_Web_default.aspx.c dcab7d2.gg3romkv.0.cs Zeile: 125


    --------------------------------------------------------------------------------
    Versionsinformationen: Microsoft .NET Framework-Version:2.0.50727.1433; ASP.NET-Version:2.0.50727.1433

    Hat jemand eine Idee?

    Gruß Stefan

  • #2
    Hallo,
    1. Code sollte in der App_Code sein damit er allen Seiten zur Verfügung steht
    2. die Profileigenschaften werden normalerweise in der web.config definiert
      Code:
      <profile inherits="gfoidl.BenutzerProfile"
      		 automaticSaveEnabled="true">
      	<properties>
      		<group name="Default">
      			<add name="Paging" 
      				 type="System.Boolean" 
      				 defaultValue="true" />
      		</group>
      		<group name="Admin">
      			<add name="BenutzerlistePaging"
      				 type="System.Boolean"
      				 defaultValue="true" />
      		</group>
      	</properties>
      	<providers>
      		<remove name="AspNetSqlProfileProvider"/>
      		<add name="AspNetSqlProfileProvider" 
      			 connectionStringName="My_aspnetConnectionString" 
      			 applicationName="/" 
      			 type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
      	</providers>
      </profile>
    3. für komplexere Einstellungen kann eine Klasse erstellt werden die von ProfilBase erbt:
      Code:
      using System;
      using System.Collections.Generic;
      using System.Web.Profile;
      
      namespace gfoidl
      {
      	/// <summary>
      	/// Implementierung eines Profils
      	/// </summary>
      	/// <remarks>
      	/// Es werden hier nur komplexe Typen deklariert. Alle
      	/// weiteren Member des Profils werden in der web.config
      	/// deklariert.
      	/// </remarks>
      	public class BenutzerProfile : ProfileBase
      	{
      		/// <summary>
      		/// Favoriten für die Motoren
      		/// </summary>
      		/// <remarks>
      		/// Es wird ein HashSet verwendet da dies keine Duplikate zulässt.
      		/// Beim Einfügen eines Duplikates wird kein Fehler geworfen sondern
      		/// dies einfach ignoriert.
      		/// </remarks>
      		public HashSet<Guid> MotorFavoriten
      		{
      			get { return base["MotorFavoriten"] as HashSet<Guid>; }
      			set { base["MotorFavoriten"] = value; }
      		}
      	}
      }
    4. somit kann im Code überall wo auf die Profileigenschaften zugegriffen werden soll dies mit Profile.<Methode oder Eigenschaft> erfolgen


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo Gü,

      vielen Dank für die Informationen. Ich habe jetzt folgende Änderungen gemacht:
      1. Klasse
      alt: public class ProfileCommon
      neu: public class BenutzerProfile : ProfileBase

      2. Default.cs
      alt: ProfileCommon Profile = new ProfileCommon();
      neu: BenutzerProfile Profile = new BenutzerProfile();

      ... und es geht.

      Die Einträge in der Web.config waren bereits in dem WebSiteProjekt vorhanden.


      Die Dokumentation von Mike Rosoft hinsichtlich der Klasse "ProfileCommon" ist an der Stelle eher irreführend, mir war hier auch schleicherhaft, von welcher Klasse "ProfileCommon" erbt. Oder spielt sie eine interne Sonderrolle??

      Hier wird allerdings auch eine Begründung gegeben, warum die Klassen des Webanwendungsprojekts nicht in dem Ordner App_Code stehen sollten, oder habe ich da etwas falsch verstanden?

      Da ASP.NET 2.0 alle Klassen dynamisch kompiliert, die es zur Laufzeit im App_Code-Verzeichnis einer Anwendung findet, sollten Sie in diesem Verzeichnis keine Klassen speichern, die Sie als Teil des Visual Studio 2005-Webanwendungsprojekts kompilieren. Andernfalls werden die Klassen zweimal kompiliert: einmal als Teil der Assembly für das Visual Studio 2005-Webanwendungsprojekt und einmal zur Laufzeit von ASP.NET. Aufgrund von doppelten Typnamen in der Anwendung wird daraufhin wahrscheinlich eine could not load type-Laufzeitausnahme ausgelöst. Stattdessen sollten Sie die Klassendateien in einem anderen Projektordner als den Ordner App_Code speichern. Der Befehl In Webanwendung konvertieren übernimmt dies automatisch, indem der Ordner in Old_App_Code umbenannt wird.
      hier der Link innerhalb der Doku:
      ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.de/dv_vwdcon/html/f1cb522d-5d49-4216-a845-db0f26e5e1f0.htm

      Gruß
      Stefan

      Comment


      • #4
        Bezüglich App_Code-Verzeichnis weiß ich jetzt selbst nicht mehr was richtig ist oder nicht

        Es gibt 2 Projektmöglichkeiten: WebSite-Projekt und Webanwendung.
        Bei letzerem, das du hast, kenn ich mich nicht aus und muss passen.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          ich kann das, was da geschrieben steht im konkreten Fall auch nicht nachvollziehen, es funktioniert sowohl mit der Klasse im Ordner App_Code als auch außerhalb.

          Trotzdem vielen Dank für die Hilfe, Dein Tip hat es jedenfalls gebracht...

          Gruß Stefan

          Comment


          • #6
            ch kann das, was da geschrieben steht im konkreten Fall auch nicht nachvollziehen,
            Interessant ist auch dass in der MSDN beide Varianten stehen. D.h. welche Seite man zuerst liest das stimmt dann. Man darf halt nicht alles lesen.

            Hauptsache es geht.

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              ja,ja,weniger ist oft mehr, oder...

              Comment

              Working...
              X