web-dev-qa-db-fra.com

Comment attribuer des valeurs de profil?

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

110
zsharp

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

Il existe deux types de projet dans Visual Studio - "Projets de site Web" et "Projets d'application Web". Pour des raisons qui me sont complètement inconnues, les projets d'application Web ne peuvent pas utiliser Profile. directement ... la classe fortement typée n'est pas générée par magie pour vous à partir du fichier Web.config, vous devez donc lancer le vôtre.

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

Vous avez deux choix pour lancer le vôtre:

(1) Utilisez Web Profile Builder . Il s'agit d'un outil personnalisé que vous ajoutez à Visual Studio qui génère automatiquement l'objet Profile 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 pour compiler, ce qui aurait pu causer des problèmes à quelqu'un d'autre sur la ligne lorsqu'ils ont essayé de construire mon code sans se rendre compte qu'ils avaient besoin de cet outil.

(2) Créez votre propre classe qui dérive de ProfileBase pour représenter votre profil personnalisé. C'est plus facile qu'il n'y paraît. Voici un exemple très très simple qui ajoute un champ de profil de chaîne "FullName":

Dans votre web.config:

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

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

</profile>

Dans un fichier appelé 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;
178
Joel Spolsky

Les projets d'application Web peuvent toujours utiliser l'objet ProfileCommon, mais uniquement au moment de l'exécution. Le code n'est 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.

La manière la plus simple d'accéder à un objet est d'utiliser un type dynamique comme illustré ci-dessous.

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

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

Puis 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 des propriétés du profil:

profile.Save();

Ce qui précède fonctionne bien si vous êtes à l'aise avec les types dynamiques et que le manque de vérification à la compilation et d'intellisense ne vous dérange pas.

Si vous l'utilisez avec ASP.Net MVC, vous devez effectuer un travail supplémentaire si vous passez l'objet de profil dynamique à vos vues car les méthodes d'assistance HTML ne fonctionnent pas bien avec les objets "modèle" 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 Joel l'a décrit ci-dessus, ASP.Net générera toujours la classe ProfileCommon mais elle 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, assurez-vous de ne pas spécifier de propriétés de profil dans le fichier Web.config que vous avez déjà déclarées dans votre classe de profil personnalisée. Si vous le faites, ASP.Net donnera une erreur de compilation lorsqu'il essaie de générer la classe ProfileCommon.

17
colivier

Le profil peut également être utilisé dans les projets d'application Web. Les propriétés peuvent être définies dans Web.config au moment du design 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 un ProfileSection et en créant des propriétés individuelles à l'aide de ProfilePropertySettings et ProfilePropertySettingsColletion, qui se trouvent tous dans System.Web. Espace de noms de configuration. Pour utiliser ces propriétés du profil, utilisez les objets System.Web.Profile.ProfileBase. Les propriétés de profil ne sont pas accessibles avec la syntaxe profile. comme mentionné ci-dessus, mais peuvent être facilement effectuées en instanciant une ProfileBase 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();
13
Bede Amarasekara

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

Cela semble probablement plus difficile qu'il ne l'est. Vous devez effectuer les opérations suivantes:

  • Créez une base de données en utilisant aspnet_regsql.exe Cet outil est installé avec le framework .NET.
  • Écrivez une classe qui dérive de ProfileGroupBase ou installez le Web Profile Builder (WPB) qui peut générer la classe pour vous à partir de la définition dans Web.Config. J'utilise WPB depuis un certain temps et jusqu'à présent, il a fait ce qu'on attend de lui. Si vous avez beaucoup de propriétés, l'utilisation de WPB peut vous faire gagner beaucoup 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 passer l'objet profil lui-même à la vue (pas les propriétés individuelles).
8
Captain Sensible

Si vous utilisez un projet d'application Web, vous ne pouvez pas accéder à l'objet Profil au moment du design dès le départ. Voici un utilitaire qui le fait censément 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, j'ai donc fini par rouler ma propre classe de profil pour hériter de ProfileBase. Ce n'était pas difficile à faire du tout.

3
nshaw

Procédure pas à pas MSDN pour créer une classe personnalisée (méthode de Joel par exemple):
http://msdn.Microsoft.com/en-us/magazine/cc163624.aspx

2
Even Mien

Je traversais é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 Behind Profile Properties

Compilez et exécutez le code. Vous obtiendrez la sortie suivante: -

Output

2
Anil Purswani

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

J'ai implémenté sa solution en travaillant avec brio entre autres - Cudos!

Pour toute personne souhaitant obtenir un profil utilisateur qui n'est pas l'utilisateur connecté 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 puis 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 ...

1
Kickass

Web Profile Builder a très bien fonctionné pour moi. La classe qu'il a générée contient beaucoup plus que celle décrite par le post de Joel. Que ce soit réellement nécessaire ou utile, je ne sais pas.

Quoi qu'il en soit, pour ceux qui recherchent un moyen facile de générer la classe, mais qui ne veulent pas avoir une dépendance d'outil de construction externe, vous pouvez toujours

  • utiliser le générateur de profil Web
  • supprimez-en toute trace!
  • continuer à utiliser la classe Profile générée

OU (non testé mais peut simplement fonctionner)

  • créer un projet de site web
  • créez votre élément
  • capturer la classe générée et la copier sur votre projet web project

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

1
Simon_Weaver

Super article,

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 individuel à l'intérieur de l'élément de profil sur le web.config comme ci-dessous

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

 </properties>
0
indy