Question

Je ne sais pas ce qui me manque, mais j'ai ajouté les propriétés de profil dans le fichier Web.config, mais je ne peux pas accéder à Profile. Élément dans le code ou créer un nouveau profil.

Était-ce utile?

La solution

J'ai eu le même problème aujourd'hui et j'ai beaucoup appris.

Il existe deux types de projets dans Visual Studio: " Projets de sites Web " et " Projets d'application Web. " Pour des raisons qui me semblent totalement mystérieuses, les projets d'application Web ne peuvent pas utiliser Profil. directement ... La classe fortement typée n'est pas générée comme par magie à partir du fichier Web.config. rouler le vôtre.

L'exemple de code dans MSDN suppose que vous utilisez un projet de site Web et vous indique simplement d'ajouter une section <profile> à votre Web.config fête et à la fête avec Profile. propriété , mais cela ne fonctionne pas dans les projets d'application Web.

Vous avez le choix entre deux choix:

(1) Utilisez le générateur de profil Web . C’est un outil personnalisé que vous ajoutez à Visual Studio et qui génère automatiquement l’objet Profil dont vous avez besoin à partir de votre définition dans Web.config.

J'ai choisi de ne pas le faire, car je ne voulais pas que mon code dépende de cet outil supplémentaire à compiler, ce qui aurait pu causer des problèmes à quelqu'un d'autre au moment où il tenterait de créer mon code sans se rendre compte qu'il en avait besoin cet outil.

(2) Créez votre propre classe dérivée de ProfileBase pour représenter votre profil personnalisé. C'est plus facile qu'il n'y parait. Voici un exemple très simple qui ajoute un & Quot; Nom complet & Quot; champ de profil de chaîne:

Dans votre configuration web:

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

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

</profile>

Dans un fichier nommé 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
    }
}

Pour définir une valeur de profil:

AccountProfile.CurrentUser.FullName = "Snoopy";

Pour obtenir une valeur de profil

string x = AccountProfile.CurrentUser.FullName;

Autres conseils

Les projets d'application Web peuvent toujours utiliser l'objet ProfileCommon, mais uniquement au moment de l'exécution. Le code correspondant n’est simplement pas généré dans le projet lui-même, mais la classe est générée par ASP.Net et est présente au moment de l’exécution.

Le moyen le plus simple d'obtenir un objet est d'utiliser un type dynamique, comme indiqué ci-dessous.

Dans le fichier Web.config, déclarez les propriétés du profil:

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

Ensuite, pour accéder aux propriétés:

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

Pour enregistrer les modifications apportées aux propriétés du profil:

profile.Save();

Ce qui précède fonctionne bien si vous êtes habitué à utiliser des types dynamiques et que le manque de vérification au moment de la compilation et d’intelliSense est insuffisant.

Si vous utilisez cela avec ASP.Net MVC, vous devez effectuer un travail supplémentaire si vous transmettez l'objet de profil dynamique à vos vues, car les méthodes d'assistance HTML ne fonctionnent pas correctement avec & "; modèle &". ; objets qui sont dynamiques. Vous devrez attribuer des propriétés de profil aux variables de type statique avant de les transmettre aux méthodes d'assistance HTML.

// 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

Si vous créez une classe de profil personnalisée, comme décrit par Joel ci-dessus, ASP.Net continuera de générer la classe ProfileCommon, mais héritera de votre classe de profil personnalisée. Si vous ne spécifiez pas de classe de profil personnalisée, ProfileCommon héritera de System.Web.Profile.ProfileBase.

Si vous créez votre propre classe de profil, veillez à ne pas spécifier les propriétés de profil dans le fichier Web.config que vous avez déjà déclaré dans votre classe de profil personnalisée. Si vous le faites, ASP.Net donnera une erreur de compilation lorsqu'il essaiera de générer la classe ProfileCommon.

Le profil peut également être utilisé dans des projets d'application Web. Les propriétés peuvent être définies dans Web.config au moment de la conception ou par programme. Dans 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>

ou par programme, créez la section de profil en instanciant une ProfileSection et en créant des propriétés individuelles à l'aide de ProfilePropertySettings et ProfilePropertySettingsColletion , qui sont tous dans le système. .Web.Configuration Namespace. Pour utiliser ces propriétés du profil, utilisez Objets System.Web.Profile.ProfileBase. Les propriétés de profil ne sont pas accessibles avec la syntaxe profile. comme indiqué ci-dessus, mais peuvent être facilement effectuées en instanciant une base de données et en utilisant SetPropertyValue (& <;> PropertyName & ";) et GetPropertyValue {&"; PropertyName & ";) comme suit:

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

ou pour accéder au profil de l'utilisateur actuel:

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

Lorsque vous créez un nouveau projet de site Web dans Visual Studio, l'objet renvoyé par Profile est généré (automatiquement) pour vous. Lorsque vous créez un projet d'application Web ou un projet MVC, vous devez lancer le vôtre.

Cela semble probablement plus difficile qu’il ne l’est. Vous devez procéder comme suit:

  • Créez une base de données à l'aide de aspnet_regsql.exe . Cet outil est installé avec le framework .NET.
  • Écrivez une classe dérivée de ProfileGroupBase ou installez le générateur de profils Web (WPB) capable de générer la classe à partir de la définition de Web.Config. J'utilise WPB depuis un moment et jusqu'à maintenant, il a répondu à toutes les attentes. Si vous avez beaucoup de propriétés, utiliser WPB peut vous faire gagner un peu de temps.
  • Assurez-vous que la connexion à la base de données est correctement configurée dans Web.Config.
  • Vous êtes maintenant prêt à créer une instance de votre classe de profil (dans le contrôleur)
  • Vous aurez probablement besoin des valeurs de propriété de profil dans vos vues. J'aime transmettre l'objet de profil lui-même à la vue (pas les propriétés individuelles).

Si vous utilisez un projet d'application Web, vous ne pouvez pas accéder à l'objet Profile dès la conception. Voici un utilitaire censé le faire pour vous: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx . Personnellement, cet utilitaire a provoqué une erreur dans mon projet et j'ai donc fini par lancer ma propre classe de profil pour hériter de ProfileBase. Ce n’était pas difficile à faire du tout.

Procédure pas à pas MSDN pour la création d'une classe personnalisée (méthode de Jo.a.):
http://msdn.microsoft.com/en-us/magazine/cc163624. aspx

Je courais également le même problème. Mais au lieu de créer une classe qui hérite de ProfileBase, j’ai utilisé HttpContext.

Spécifiez les propriétés dans le fichier web.config comme suit: - ProfilePropertyWeb.config

Maintenant, écrivez le code suivant: -

Code derri&egrave;re les propri&eacute;t&eacute;s du profil

Compilez et exécutez le code. Vous obtiendrez le résultat suivant: -

Sortie

Le générateur de profil Web a fonctionné à merveille pour moi. La classe qu’elle a générée contient bien plus que ce que décrit le post de Joel. Que ce soit utile ou utile ou pas, je ne sais pas.

Quoi qu'il en soit, pour ceux qui recherchent un moyen simple de générer la classe, mais ne souhaitant pas avoir de dépendance à un outil de génération externe, vous pouvez toujours

  • utiliser le générateur de profil Web
  • supprimez toute trace!
  • continue à utiliser la classe de profil générée

OU (non testé mais peut fonctionner)

  • créer un site Web projet
  • créez votre élément
  • capturez la classe générée et copiez-la dans votre projet projet Web

si cette seconde approche fonctionne, quelqu'un peut-il me le faire savoir pour référence future

Je veux juste ajouter à la réponse de Joel Spolsky

J'ai mis en œuvre sa solution, en travaillant brillamment - Cudos!

Pour ceux qui souhaitent obtenir un profil d'utilisateur différent de celui que j'ai utilisé:

web.config:

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

et

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

Et ensuite ma classe personnalisée:

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

Fonctionne comme un charme ...

Excellent post,

Juste une note sur le web.config si vous ne spécifiez pas l'attribut inherit dans l'élément de profil vous devrez spécifier chaque propriété de profil indiviudal à l'intérieur du profil élément sur le web.config comme ci-dessous

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

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