tag route page net for asp asp.net asp.net-mvc asp.net-membership profile

asp.net - route - ¿Cómo asignar valores de perfil?



select asp-for asp-items (10)

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

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

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.


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).

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 compilació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?


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


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 dinámico como se demuestra 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 te sientes cómodo usando tipos dinámicos y no te importa la falta de comprobación en tiempo de compilación y intellisense.

Si usa esto con ASP.Net MVC, debe 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 objetos "modelo" que son dinámicos. 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 compilación cuando intente generar la clase ProfileCommon.



Solo quiero agregar a la respuesta de Joel Spolsky

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

Para cualquiera que desee obtener un perfil de usuario que no sea el usuario conectado, 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 de maravilla...


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:

Ahora, escribe el siguiente código:

Compila y ejecuta el código. Obtendrás la siguiente salida: -



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 <profile> 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 compilar, 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:

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