Pergunta

Eu não sei o que estou ausente, mas eu adicionei propriedades perfil no arquivo Web.config mas não pode acessar perfil. Item no código ou criar um novo perfil.

Foi útil?

Solução

Eu tive o mesmo problema hoje, e aprendi muito.

Existem dois tipos de projeto no Visual Studio - "Projetos Web Site" e "Web Application Projects." Por razões que são um completo mistério para mim, projetos de aplicativos da Web não pode usar Perfil. diretamente ... a classe de rigidez não é magicamente gerado para você a partir do arquivo Web.config, então você tem que rolar o seu próprio.

O código de exemplo MSDN assume que você está usando um projeto Web Site, e eles dizem que você acabou de adicionar uma seção <profile> ao seu Web.config e festa com Profile. propriedade , mas isso não funciona em projetos de aplicativos da web.

Você tem duas opções para rolar o seu próprio:

(1) Use o Web Profile Builder . Esta é uma ferramenta personalizada que você adicionar ao Visual Studio que gera automaticamente o objeto de perfil você precisa de sua definição em Web.config.

Eu escolhi não fazer isso, porque eu não queria que meu código para dependem desta ferramenta extra para compilar, o que poderia ter causado problemas para alguém para baixo da linha quando eles tentaram construir meu código sem perceber que eles precisavam esta ferramenta.

(2) Faça a sua própria classe que deriva de ProfileBase para representar o seu perfil personalizado. Isto é mais fácil do que parece. Aqui está um exemplo muito simples que adiciona um campo de perfil string "FullName":

No seu web.config:

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

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

</profile>

em um arquivo chamado 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 definir um valor perfil:

AccountProfile.CurrentUser.FullName = "Snoopy";

Para obter um valor de perfil

string x = AccountProfile.CurrentUser.FullName;

Outras dicas

Projetos de aplicativos Web ainda pode usar o objeto ProfileCommon mas apenas em tempo de execução. O código para ele simplesmente não é gerado no próprio projeto, mas a classe é gerado pelo ASP.Net e está presente em tempo de execução.

A maneira mais simples para chegar ao objeto é usar um tipo dinâmico, como demonstrado abaixo.

No arquivo Web.config declarar as propriedades do perfil:

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

Depois de acessar as propriedades:

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

Para salvar as alterações para propriedades de perfil:

profile.Save();

O funciona bem acima, se você está confortável usando tipos dinâmicos e não se importa a falta de verificação de tempo de compilação e intellisense.

Se você usar isso com ASP.Net MVC você tem que fazer algum trabalho adicional, se você passar o objeto perfil dinâmico aos seus pontos de vista, desde os métodos de ajuda HTML não jogam bem com objetos "modelo" que são dinâmicos. Você terá de propriedades do perfil de atribuir a variáveis ??de tipagem estática antes de passá-los para HTML auxiliares métodos.

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

Se você criar uma classe de perfil personalizado, como Joel descrito acima, ASP.Net ainda vai gerar a classe ProfileCommon mas vai herdar de sua classe perfil personalizado. Se você não especificar uma classe de perfil personalizado ProfileCommon vai herdar de System.Web.Profile.ProfileBase.

Se você criar sua própria classe perfil certeza de que você não especificar as propriedades de perfil no arquivo Web.config que você já declarou em sua classe de perfil personalizado. Se você ASP.Net dará um erro do compilador quando ele tenta gerar a classe ProfileCommon.

Perfil pode ser usado em projetos de aplicativos da Web também. As propriedades pode ser definido em web.config no momento da concepção ou programação. Em 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 programaticamente, criar a seção de perfil por instanciar um ProfileSection e criando propriedades individuais usando ProfilePropertySettings e ProfilePropertySettingsColletion , todos os quais estão em Sistema .Web.Configuration Namespace. Para usar essas propriedades do perfil, uso System.Web.Profile.ProfileBase Objects. As propriedades do perfil não pode ser acessado com o perfil. sintaxe, como mencionado acima, mas pode ser feito facilmente por instanciar um ProfileBase e usando SetPropertyValue ( " PropertyName ") e GetPropertyValue {" PropertyName ") como segue:

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

ou para acessar o perfil do usuário atual:

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

Quando você cria um novo projeto Web site no Visual Studio, em seguida, o objeto que é retornado do perfil será (automaticamente) gerado para você. Quando você cria um projeto de aplicativo Web ou um projeto MVC, você vai ter que rolar o seu próprio.

Isso provavelmente soa mais difícil do que é. Você precisa fazer o seguinte:

  • Criar um banco de dados usando aspnet_regsql.exe Esta ferramenta é instalada junto com o .NET framework.
  • Escreva uma classe que deriva de ProfileGroupBase ou instalar o perfil Web Builder (WPB) que pode gerar a classe para você a partir da definição no Web.Config. Tenho vindo a utilizar WPB por um tempo e até agora tem feito o que se espera dele. Se você tem um monte de propriedades, utilizando WPB pode economizar um bocado de tempo.
  • Certifique-se a conexão com o banco de dados está configurado corretamente no Web.Config.
  • Agora você está pronto para criar uma instância de sua classe perfil (no controlador)
  • Você provavelmente terá os valores de propriedade de perfil em seus pontos de vista. Eu gosto de passar o próprio objeto perfil junto à vista (não propriedades individuais).

Se você estiver usando um projeto de aplicativo web, você não pode acessar o objeto de perfil em tempo de design out-of-the-box. Aqui é um utilitário que supostamente faz isso para você: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx . Pessoalmente, esse utilitário causou um erro em meu projeto para que eu acabei rolando minha própria classe perfil para herdar de ProfileBase. Não era difícil de fazer em tudo.

MSDN passo a passo para a criação de uma classe personalizada (A.K.A. método de Joel):
http://msdn.microsoft.com/en-us/magazine/cc163624. aspx

Eu também estava correndo através do mesmo problema. Mas em vez de criar uma classe que herda de ProfileBase, eu usei o HttpContext.

Especifique propriedades no arquivo web.config da seguinte forma: - ProfilePropertyWeb.config

Agora, escreva o seguinte código: -

C&oacute;digo Atr&aacute;s propriedades de perfil

Compilar e executar o código. Você vai ter seguinte resultado: -

Output

O Perfil Web Builder trabalhou muito para mim. A classe que gerou tem muito mais nele do que como descrito por post de Joel. Quer ou não a sua realmente necessário ou útil eu não sei.

De qualquer forma para aqueles que procuram uma maneira fácil de gerar a classe, mas não querendo ter uma dependência ferramenta de construção externa que você pode sempre

  • usar o construtor perfil web
  • apagar todos os vestígios dela!
  • manter usando a classe Perfil gerado

OR (não testado, mas podem apenas trabalho)

  • criar um web site projecto
  • criar o seu elemento
  • Encaixar a classe gerada e copie-o para o seu web projecto projecto

Se esta segunda abordagem não funciona, alguém pode me avise para referência futura

Apenas deseja adicionar à resposta de Joel Spolsky

Eu implementei a sua solução, trabalhando de forma brilhante btw - Cudos

Para qualquer pessoa que queira obter um perfil de usuário que não é o usuário conectado que eu usei:

web.config:

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

e

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

E então minha classe 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 um encanto ...

Great post,

Apenas uma nota no web.config Se você não especificar o atributo herdar no elemento de perfil você precisará especificar cada propriedade de perfil indiviudal dentro do perfil elemento no web.config como abaixo

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

 </properties>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top