Pregunta

No sé lo que me estoy perdiendo, pero he añadido las propiedades de Perfil en la Web.archivo de configuración, pero no puede acceder a su Perfil.Elemento en el código o crear un nuevo perfil.

¿Fue útil?

Solución

Yo tenía el mismo problema hoy en día, y he aprendido mucho.

Hay dos tipos de proyecto en Visual Studio -- "los Proyectos de Sitio Web" y "Proyectos de Aplicación Web." Por razones que son un completo misterio para mí, Proyectos de Aplicación Web puede utilizar Perfil. directamente...el establecimiento inflexible de tipos de clase no es por arte de magia generado para usted desde la Web.archivo de configuración, por lo que usted tiene que tirar de su propio.

El código de ejemplo en MSDN asume que usted está usando un Sitio Web del Proyecto, y dicen que acaba de agregar un <profile> sección a su Web.config y el partido con Profile.la propiedad, pero que no trabaja en Proyectos de Aplicación Web.

Usted tiene dos opciones para rodar su propia:

(1) el Uso de la Perfil Web Builder.Esta es una herramienta personalizada que añadir a Visual Studio que genera automáticamente el objeto de Perfil que necesita de su definición en la Web.config.

Decidí no hacerlo, porque yo no quiero que mi código para que dependen de esta herramienta extra para compilar, lo que podría haber causado problemas a alguien más abajo de la línea cuando se trató de hacer mi código sin darse cuenta que se necesita de esta herramienta.

(2) Hacer su propia clase que se deriva de ProfileBase para representar el perfil personalizado.Esto es más fácil de lo que parece.Aquí tienes un ejemplo muy simple que añade un "FullName" cadena de campo perfil:

En su web.config:

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

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

</profile>

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;

Otros consejos

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

La forma más sencilla de llegar al objeto es usar un tipo dinámico como se muestra a continuación.

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

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

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 se siente cómodo usando tipos dinámicos y no le importa la falta de verificación en tiempo de compilación e inteligencia.

Si usa esto con ASP.Net MVC, tiene que hacer un trabajo adicional si pasa el objeto de perfil dinámico a sus vistas ya que los métodos de ayuda HTML no funcionan bien con " model " ; objetos que son dinámicos. Tendrá que asignar propiedades de perfil a variables escritas estáticamente antes de pasarlas a los 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 Joel describió anteriormente, ASP.Net seguirá generando 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 las propiedades del perfil en el archivo Web.config que ya ha declarado en su clase de perfil personalizado. Si lo hace, ASP.Net dará un error de compilació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 programación. En 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>

o mediante programación, cree la sección de perfil creando una instancia de ProfileSection y creando propiedades individuales usando ProfilePropertySettings y ProfilePropertySettingsColletion , todas las cuales están en el Sistema .Web. Espacio de nombres de configuración. Para usar esas propiedades del perfil, use System.Web.Profile.ProfileBase Objects. No se puede acceder a las propiedades del perfil con la sintaxis profile. como se mencionó anteriormente, pero se puede hacer fácilmente creando una instancia de ProfileBase y usando SetPropertyValue (& Quot; 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) para usted. Cuando cree un proyecto de aplicación web o un proyecto MVC, tendrá que rodar el suyo.

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

  • Cree una base de datos con aspnet_regsql.exe Esta herramienta se instala junto con el marco .NET.
  • Escriba una clase que se derive de ProfileGroupBase o instale el Creador de perfiles web (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 espera de él. Si tiene muchas propiedades, usar WPB puede ahorrarle 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)
  • Probablemente necesitará los valores de propiedad del perfil en sus vistas. Me gusta pasar el objeto de perfil a 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 listo para usar. 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 causó 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 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é el HttpContext.

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

Ahora, escriba el siguiente código: -

C&oacute;digo detr&aacute;s de las propiedades del perfil

Compila y ejecuta el código. Obtendrá el siguiente resultado: -

Salida

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

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

  • usa el creador de perfiles web
  • ¡borra todo rastro!
  • siga usando la clase de perfil generada

O (no probado pero puede funcionar)

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

si este segundo enfoque funciona, ¿alguien puede avisarme para futuras referencias?

Solo quiero agregar a la respuesta de Joel Spolsky

Implementé su solución, trabajando brillantemente por cierto - Cudos!

Para cualquier persona que desee obtener un perfil de usuario que no sea el usuario conectado que utilicé:

web.config:

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

y

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

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

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

Funciona como un encanto ...

Gran publicación,

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

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

 </properties>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top