¿Cómo asignar valores de perfil?

No sé lo que me falta, pero agregué Propiedades de perfil en el archivo Web.config pero no puedo acceder a Perfil. Artículo en el código o crear un nuevo perfil.

Tuve el mismo problema hoy, y aprendí mucho.

Existen dos tipos de proyectos en Visual Studio: “Proyectos de sitios web” y “Proyectos de aplicaciones web”. Por razones que son un completo misterio para mí, los proyectos de aplicaciones web no pueden usar el perfil. directamente … la clase fuertemente tipada no se genera mágicamente para usted desde el archivo Web.config, por lo que tiene que hacer la suya propia.

El código de ejemplo en MSDN supone que está utilizando un proyecto de sitio web, y le dicen que simplemente agregue una sección a su Web.config y que se Web.config de acuerdo con Profile. propiedad , pero eso no funciona en los proyectos de aplicaciones web.

Tienes dos opciones para ti mismo:

(1) Use el generador de perfiles web . Esta es una herramienta personalizada que agrega a Visual Studio que genera automáticamente el objeto de perfil que necesita de su definición en Web.config.

Elegí no hacer esto, porque no quería que mi código dependiera de esta herramienta adicional para comstackr, lo que podría haber causado problemas para alguien más en el futuro cuando intentaron construir mi código sin darse cuenta de que necesitaban esta herramienta.

(2) Cree su propia clase que se deriva de ProfileBase para representar su perfil personalizado. Esto es más fácil de lo que parece. Aquí hay un ejemplo muy simple que agrega un campo de perfil de cadena “FullName”:

En su web.config:

       

En un archivo llamado 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 } } 

Para establecer un valor de perfil:

 AccountProfile.CurrentUser.FullName = "Snoopy"; 

Para obtener un valor de perfil

 string x = AccountProfile.CurrentUser.FullName; 

Los proyectos de aplicaciones web aún pueden usar el objeto ProfileCommon pero solo en tiempo de ejecución. El código para ello simplemente no se genera en el proyecto en sí, pero la clase es generada por ASP.Net y está presente en el tiempo de ejecución.

La forma más sencilla de llegar a un objeto es usar un tipo dynamic como se demuestra a continuación.

En el archivo Web.config, declare las propiedades del perfil:

     

Luego para acceder a las propiedades:

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

Para guardar los cambios en las propiedades del perfil:

 profile.Save(); 

Lo anterior funciona bien si te sientes cómodo usando tipos dynamics y no te importa la falta de comprobación en tiempo de comstackción y intellisense.

Si usa esto con ASP.Net MVC, debe hacer un trabajo adicional si pasa el objeto de perfil dynamic a sus vistas, ya que los métodos de ayuda HTML no funcionan bien con objetos “modelo” que son dynamics. Tendrá que asignar propiedades de perfil a variables tipadas estáticamente antes de pasarlas a métodos de ayuda 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 crea una clase de perfil personalizada, como describió Joel anteriormente, ASP.Net aún generará la clase ProfileCommon, pero heredará de su clase de perfil personalizada. Si no especifica una clase de perfil personalizada, ProfileCommon heredará de System.Web.Profile.ProfileBase.

Si crea su propia clase de perfil, asegúrese de no especificar propiedades de perfil en el archivo Web.config que ya ha declarado en su clase de perfil personalizada. Si lo hace ASP.Net dará un error de comstackción cuando intente generar la clase ProfileCommon.

El perfil también se puede usar en proyectos de aplicaciones web. Las propiedades se pueden definir en Web.config en tiempo de diseño o mediante progtwigción. En Web.config:

                  

o mediante progtwigción, cree la sección de perfil creando una instancia de ProfileSection y creando propiedades individuales usando ProfilePropertySettings y ProfilePropertySettingsColletion , todas ellas en System.Web.Configuration Namespace. Para usar esas propiedades del perfil, use los objetos System.Web.Profile.ProfileBase. No se puede acceder a las propiedades del perfil con el perfil. syntax como se mencionó anteriormente, pero se puede hacer fácilmente instanciando un ProfileBase y usando SetPropertyValue (” PropertyName “) y GetPropertyValue {” PropertyName “) de la siguiente manera:

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

o para acceder al perfil del usuario actual:

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

Cuando crea un nuevo proyecto de sitio web en Visual Studio, el objeto que se devuelve desde Profile se generará (automáticamente) por usted. Cuando crea un proyecto de aplicación web o un proyecto MVC, tendrá que implementar el suyo propio.

Esto probablemente suena más difícil de lo que es. Debes hacer lo siguiente:

  • Cree una base de datos usando aspnet_regsql.exe Esta herramienta se instala junto con .NET framework.
  • Escriba una clase que se deriva de ProfileGroupBase o instale el Web Profile Builder (WPB) que puede generar la clase para usted a partir de la definición en Web.Config. He estado usando WPB por un tiempo y hasta ahora ha hecho lo que se esperaba de él. Si tiene muchas propiedades, usar WPB puede ahorrar bastante tiempo.
  • Asegúrese de que la conexión a la base de datos esté configurada correctamente en Web.Config.
  • Ahora está configurado para crear una instancia de su clase de perfil (en el controlador)
  • Es probable que necesite los valores de propiedad de perfil en sus vistas. Me gusta pasar el objeto de perfil a lo largo de la vista (no propiedades individuales).

Si está utilizando un proyecto de aplicación web, no puede acceder al objeto Perfil en tiempo de diseño desde el primer momento. Aquí hay una utilidad que supuestamente lo hace por usted: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx . Personalmente, esa utilidad provocó un error en mi proyecto, así que terminé rodando mi propia clase de perfil para heredar de ProfileBase. No fue difícil de hacer en absoluto.

Tutorial de MSDN para crear una clase personalizada (también conocido como el método de Joel):
http://msdn.microsoft.com/en-us/magazine/cc163624.aspx

También estaba pasando por el mismo problema. Pero en lugar de crear una clase que herede de ProfileBase, utilicé HttpContext.

Especifique las propiedades en el archivo web.config de la siguiente manera: ProfilePropertyWeb.config

Ahora, escribe el siguiente código:

Código detrás de las propiedades del perfil

Comstack y ejecuta el código. Obtendrás la siguiente salida: –

Salida

El Web Profile Builder funcionó muy bien para mí. La clase que generó tiene mucho más que la descrita por la publicación de Joel. Si no es realmente necesario o útil, no lo sé.

De todos modos, para aquellos que buscan una manera fácil de generar la clase, pero no desean tener una dependencia externa de la herramienta de comstackción, siempre pueden

  • usar el creador de perfil web
  • borra todo rastro de eso!
  • sigue usando la clase de perfil generada

O (no probado pero puede funcionar)

  • crear un proyecto de sitio web
  • crea tu elemento
  • encaje la clase generada y cópiela en su proyecto de proyecto web

si este segundo enfoque funciona, ¿alguien me puede avisar para referencia futura?

Solo quiero agregar a la respuesta de Joel Spolsky

Implementé su solución, trabajando shinymente por cierto – ¡Cudos!

Para cualquiera que desee obtener un perfil de usuario que no sea el usuario conectado, utilicé:

web.config:

      

y

      

Y luego mi clase personalizada:

 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)); } ///  /// Find user with matching barcode, if no user is found function throws exception ///  /// The barcode to compare against the user barcode /// The AccountProfile class with matching barcode or null if the user is not found 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(); } } } } 

Funciona de maravilla…

Buena publicación,

Solo una nota en la web.config si no especifica el atributo de heredar en el elemento de perfil, necesitará especificar cada propiedad de perfil indiviudal dentro del elemento de perfil en el web.config como se muestra a continuación

      ..........