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. Article dans le code ou créer un nouveau profil.
Réponses
Trop de publicités?J'ai eu le même problème aujourd'hui, et beaucoup appris.
Il existe deux types de projet dans Visual Studio -- "Projets de Site Web" et "Projets d'Application Web." Pour des raisons qui sont pour moi un mystère complet, les Projets d'Application Web ne peut pas utiliser le Profil. directement... fortement typées classe n'est pas comme par magie généré à partir du Web.fichier de config, donc vous devez les lancer votre propre.
L'exemple de code dans MSDN suppose l'utilisation d'un Projet de Site Web, et ils vous disent juste pour ajouter un <profile>
section de votre Web.config
et la partie avec Profile.
de la propriété, mais qui ne fonctionne pas dans les Projets d'Application Web.
Vous avez deux choix pour rouler vos propres:
(1) Utiliser le Profil Web Builder. C'est un outil personnalisé que vous ajoutez à Visual Studio qui génère automatiquement le Profil de l'objet dont vous avez besoin à partir de votre définition dans le Web.config.
J'ai choisi de ne pas le faire, parce que je ne veux pas que mon code dépendent de cet outil supplémentaire à la compilation, ce qui pourrait avoir causé des problèmes à quelqu'un d'autre sur la ligne quand ils ont essayé de construire mon code sans se rendre compte qu'ils avaient besoin de cet outil.
(2) Faire 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 simple qui ajoute un "FullName" chaîne de champ profil:
Dans votre site 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;
Les Projets d'Application Web pouvez toujours utiliser le ProfileCommon objet, mais seulement au moment de l'exécution. Le code est tout simplement pas générée par le projet lui-même mais la classe est générée par ASP.Net et il est présent au moment de l'exécution.
Le moyen le plus simple pour se rendre à l'objet est d'utiliser un type dynamique comme illustré ci-dessous.
Dans le Web.fichier de configuration de déclarer les propriétés de profil:
<profile ...
<properties>
<add name="GivenName"/>
<add name="Surname"/>
</properties>
Pour accéder aux propriétés de:
dynamic profile = ProfileBase.Create(Membership.GetUser().UserName);
string s = profile.GivenName;
profile.Surname = "Smith";
Pour enregistrer les modifications apportées aux propriétés de profil:
profile.Save();
Le ci-dessus fonctionne très bien si vous êtes à l'aise avec les types de dynamiques et de ne pas l'esprit de l'absence de la compilation de la vérification et de l'intellisense.
Si vous utilisez cette fonction avec ASP.Net MVC vous avez à faire un peu de travail supplémentaire si vous passez le profil dynamique de l'objet de votre point de vue depuis le helper HTML méthodes ne joue pas bien avec le "modèle" des objets qui sont dynamiques. Vous devez affecter les propriétés de profil à typage statique des variables avant de les passer au format HTML helper.
// 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 un profil personnalisé de classe, comme Joel décrit ci-dessus, ASP.Net continue de générer de la ProfileCommon classe, mais il va hériter de votre profil personnalisé de classe. Si vous ne spécifiez pas un profil personnalisé de classe ProfileCommon va hériter de Système.Web.De profil.ProfileBase.
Si vous créez votre propre profil de classe assurez-vous que vous ne spécifiez les propriétés de profil dans le site Web.fichier de configuration que vous avez déjà déclaré votre profil personnalisé de classe. Si vous ne ASP.Net donnera une erreur du compilateur lorsqu'il essaie de générer le ProfileCommon classe.
Le profil peut être utilisé dans des Projets d'Application Web. Les propriétés peuvent être définies dans le Web.config au moment de la conception ou de la programmation. Dans Le 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 programmation, créer la section de profil par l'instanciation d'un ProfileSection et la création de propriétés individuelles à l'aide de ProfilePropertySettings et ProfilePropertySettingsColletion, qui sont dans le Système.Web.La Configuration De L'Espace De Noms. Pour utiliser ces propriétés du profil, de l'utilisation du Système.Web.De profil.ProfileBase Objets. Les propriétés de profil ne sont pas accessibles avec le profil de. la syntaxe comme mentionné ci-dessus, mais peut être fait facilement par l'instanciation d'un ProfileBase et à l'aide de SetPropertyValue("PropertyName") et GetPropertyValue{"PropertyName") comme suit:
ProfileBase curProfile = ProfileBase.Create("MyName");
ou pour accéder au profil de l'utilisateur courant:
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, puis l'objet est retourné à partir de Profil sera automatiquement généré pour vous. Lorsque vous créez un projet d'application Web ou un projet MVC, vous devrez faire vos propres.
C'est probablement ce qui semble plus difficile qu'elle ne l'est. Vous devez faire ce qui suit:
- Créer une base de données à l'aide de aspnet_regsql.exe Cet outil est installé avec la .NET framework.
- Écrire une classe qui dérive de ProfileGroupBase ou d'installer le Profil Web Builder (WPB) qui peut générer de la classe pour vous à partir de la définition dans le Web.Config. J'ai été en utilisant WPB pendant un certain temps et jusqu'à maintenant, il a fait ce que l'on attend d'elle. Si vous avez beaucoup de propriétés, à l'aide WPB pouvez enregistrer un peu de temps.
- Assurez-vous que la connexion à la base de données est correctement configuré dans le Web.Config.
- Maintenant vous êtes prêt à créer une instance de votre profil de classe (dans le contrôleur)
- Vous aurez probablement besoin de le profil des valeurs de propriété dans vos vues. J'aime transmettre le profil de l'objet lui-même le long de la vue (et non des propriétés individuelles).
Si vous utilisez un projet d'application web, vous ne pouvez pas accéder au Profil de l'objet au moment de la conception out-of-the-box. Voici un utilitaire qui soi-disant fait 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 mon propre profil de classe d'hériter de ProfileBase. Il n'était pas difficile à faire.