110 votos

¿Cómo se asignan los valores de perfil?

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

178voto

Joel Spolsky Puntos 22686

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 el Perfil. directamente... el establecimiento inflexible de tipos de clase no es por arte de magia se genera a partir de la Web.archivo de configuración, por lo que usted tiene que hacer rodar su propio.

El código de ejemplo en MSDN se supone que está utilizando un Proyecto de Sitio Web, y te dicen que acaba de agregar un <profile> sección para su Web.config y el partido con Profile.de la propiedad, pero que no trabaja en Proyectos de Aplicación Web.

Tienes dos opciones para hacerte el tuyo propio:

(1) el Uso de la Web Generador de perfiles. Esta es una costumbre de la herramienta agregar a Visual Studio que genera automáticamente el Perfil de objeto que necesita, a partir de su definición en la Web.config.

Yo elegí no hacerlo, porque no quería que mi código para que dependen de esta herramienta extra para compilar, lo que podría haber ocasionado 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 deriva de ProfileBase de representar a su 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;

16voto

colivier Puntos 361

Proyectos de Aplicación Web todavía puede usar el ProfileCommon objeto, sino sólo en tiempo de ejecución. El código para el no es generado en el proyecto, pero la clase se genera por ASP.Net y está presente en tiempo de ejecución.

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

En la Web.archivo de configuración de declarar las propiedades de perfil de:

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

A continuación, para acceder a las propiedades:

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

Para guardar los cambios a las propiedades de perfil de:

profile.Save();

Lo anterior funciona bien si usted se siente cómodo usando tipos dinámicos y no les importa la falta de tiempo de compilación de cheques y de intellisense.

Si utiliza este con ASP.Net MVC tienes que hacer algo de trabajo adicional si pasa el perfil dinámico de objetos a las vistas desde el HTML métodos auxiliares no juegan bien con el "modelo" de los objetos que son dinámicos. Usted tendrá que asignar las propiedades de perfil de estáticamente tipado de variables antes de pasar a HTML métodos auxiliares.

// 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 usted crea un perfil personalizado de clase, como Joel descrito anteriormente, ASP.Net todavía va a generar el ProfileCommon clase, sino que va a heredar de su perfil personalizado de clase. Si no se especifica un perfil personalizado de clase ProfileCommon van a heredar de Sistema.De la Web.De perfil.ProfileBase.

Si usted cree su propio perfil de clase asegúrese de que usted no especifique las propiedades de perfil en la Web.archivo de configuración que usted ya ha declarado en su perfil personalizado de clase. Si no ASP.Net le dará un compilador de error cuando intenta generar el ProfileCommon clase.

8voto

Diego Deberdt Puntos 1969

Cuando se crea un sitio Web nuevo proyecto en Visual Studio, a continuación, el objeto que se devuelve desde el Perfil será automáticamente generará para usted. Al crear un proyecto de aplicación Web o de un proyecto MVC, usted tendrá que lanzar su propio.

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

  • Crear una base de datos utilizando aspnet_regsql.exe Esta herramienta se instala junto con el .NET framework.
  • Escribir una clase que deriva de ProfileGroupBase o instalar el Perfil Web Builder (WPB) que puede generar la clase para usted a partir de la definición en la Web.Config. He estado usando WPB por un tiempo y hasta ahora se ha hecho lo que se espera de él. Si usted tiene un montón de propiedades, utilizando WPB se puede ahorrar un poco de tiempo.
  • Asegúrese de que la conexión a la base de datos está configurado correctamente en la Web.Config.
  • Ahora usted está listo para crear una instancia de su perfil de clase (en el controlador)
  • Usted probablemente necesitará los valores de propiedad de perfil en tus puntos de vista. Me gusta pasar el perfil propio objeto a la vista (no cada una de las propiedades).

3voto

nshaw Puntos 1506

Si usted está usando un proyecto de aplicación web, usted no puede tener acceso al objeto de Perfil en tiempo de diseño out-of-the-box. Aquí es 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 producido un error en mi proyecto, así que terminó de rodar mi propio perfil de clase debe heredar de ProfileBase. No fue difícil hacerlo a todos.

2voto

Even Mien Puntos 10122

MSDN tutorial para crear una clase personalizada (también conocido como método de Joel):
http://msdn.Microsoft.com/en-US/Magazine/cc163624.aspx

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: