문제

무엇이 누락되었는지 모르겠지만 Web.config 파일에 프로필 속성을 추가했지만 프로필에 액세스할 수 없습니다.안건 코드에 넣거나 새 프로필을 만드세요.

도움이 되었습니까?

해결책

나는 오늘 같은 문제가 있었고 많은 것을 배웠습니다.

Visual Studio에는 "웹 사이트 프로젝트"와 "웹 응용 프로그램 프로젝트"의 두 가지 종류가 있습니다. 나에게 완전한 미스터리 인 이유 때문에 웹 응용 프로그램 프로젝트는 사용할 수 없습니다. 프로필. 직접 ... 강력한 클래스는 Web.config 파일에서 마술처럼 생성되지 않으므로 직접 굴려야합니다.

MSDN의 샘플 코드는 귀하가 웹 사이트 프로젝트를 사용하고 있다고 가정하며 <profile> 당신의 섹션 Web.config 그리고 파티 Profile.재산, 그러나 그것은 웹 응용 프로그램 프로젝트에서는 작동하지 않습니다.

당신은 당신 자신의 두 가지 선택이 있습니다.

(1) 사용하십시오 웹 프로필 빌더. 이것은 web.config의 정의에서 필요한 프로필 객체를 자동으로 생성하는 Visual Studio에 추가하는 사용자 정의 도구입니다.

이 추가 도구를 컴파일하는 데 의존하지 않기 때문에이 작업을 수행하지 않기로 결정했습니다.이 도구 가이 도구가 필요하다는 사실을 깨닫지 않고 내 코드를 구축하려고 할 때 다른 사람에게 문제가 발생할 수있었습니다.

(2) 파생 된 자신의 수업을 만드십시오. ProfileBase 사용자 정의 프로필을 나타냅니다. 이것은 보이는 것보다 쉽습니다. 다음은 "FullName"문자열 프로파일 필드를 추가하는 매우 간단한 예입니다.

web.config에서 :

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

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

</profile>

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

프로필 값을 설정하려면 :

AccountProfile.CurrentUser.FullName = "Snoopy";

프로필 값을 얻으려면

string x = AccountProfile.CurrentUser.FullName;

다른 팁

웹 애플리케이션 프로젝트는 여전히 ProfileCommon 개체를 사용할 수 있지만 런타임에만 사용할 수 있습니다.이에 대한 코드는 프로젝트 자체에서 생성되지 않지만 클래스는 ASP.Net에 의해 생성되고 런타임에 존재합니다.

객체에 접근하는 가장 간단한 방법은 아래와 같이 동적 유형을 사용하는 것입니다.

Web.config 파일에서 프로필 속성을 선언합니다.

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

그런 다음 속성에 액세스하려면 다음을 수행하십시오.

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

프로필 속성에 대한 변경 사항을 저장하려면:

profile.Save();

위의 방법은 동적 유형 사용에 익숙하고 컴파일 타임 검사 및 intellisense가 부족하다는 점에 신경 쓰지 않는다면 잘 작동합니다.

ASP.Net MVC와 함께 이를 사용하는 경우 HTML 도우미 메서드가 동적 "모델" 개체와 잘 작동하지 않기 때문에 동적 프로필 개체를 보기에 전달하는 경우 몇 가지 추가 작업을 수행해야 합니다.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

위에서 설명한 Joel처럼 사용자 정의 프로필 클래스를 만드는 경우 ASP.Net은 여전히 ​​ProfileCommon 클래스를 생성하지만 사용자 정의 프로필 클래스에서 상속됩니다.사용자 정의 프로필 클래스를 지정하지 않으면 ProfileCommon은 System.Web.Profile.ProfileBase에서 상속됩니다.

고유한 프로필 클래스를 만드는 경우 사용자 지정 프로필 클래스에서 이미 선언한 프로필 속성을 Web.config 파일에 지정하지 않았는지 확인하세요.그렇게 하면 ASP.Net이 ProfileCommon 클래스를 생성하려고 할 때 컴파일러 오류가 발생합니다.

프로필은 웹 응용 프로그램 프로젝트에서도 사용할 수 있습니다. 속성은 설계 시간 또는 프로그래밍 방식으로 web.config에서 정의 할 수 있습니다. 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>

또는 프로그래밍 방식으로 인스턴스화하여 프로필 섹션을 만듭니다. 프로파일 섹션 및 개별 속성을 사용하여 생성합니다 ProfilePropertySettings 그리고 ProfilePropertySettingScolletion, 모두 system.web.configuration 네임 스페이스에 있습니다. 프로파일의 해당 속성을 사용하려면 System.Web.profile.profilebase 객체를 사용하십시오. 프로파일 속성에 액세스 할 수 없습니다 프로필. 위에서 언급 한 구문이지만 프로파일베이스를 인스턴스화하고 사용하여 쉽게 수행 할 수 있습니다. setPropertyValue("PropertyName") 그리고 getPropertyValue{"PropertyName") 다음과 같이 :

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

또는 현재 사용자의 프로필에 액세스하려면 :

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

Visual Studio에서 새 웹 사이트 프로젝트를 만들 때 프로필에서 반환되는 객체가 (자동으로) 생성됩니다. 웹 애플리케이션 프로젝트 또는 MVC 프로젝트를 만들 때 직접 출시해야합니다.

이것은 아마도 그보다 더 어려워 질 것입니다. 다음을 수행해야합니다.

  • 사용하여 데이터베이스를 만듭니다 aspnet_regsql.exe 이 도구는 .NET 프레임 워크와 함께 설치됩니다.
  • ProfileGroupBase에서 파생 된 클래스를 작성하거나 WPB (Web Profile Builder)를 설치하여 Web.Config의 정의에서 클래스를 생성 할 수 있습니다. 나는 잠시 동안 WPB를 사용해 왔으며 지금까지는 예상되는 일을했습니다. 속성이 많으면 WPB를 사용하면 상당한 시간을 절약 할 수 있습니다.
  • web.config에서 데이터베이스에 대한 연결이 올바르게 구성되어 있는지 확인하십시오.
  • 이제 프로필 클래스의 인스턴스를 생성하도록 설정되어 있습니다 (컨트롤러에서)
  • 당신은 아마도 당신의 견해에 프로필 속성 값이 필요할 것입니다. 나는 프로파일 객체 자체를 뷰 (개별 속성이 아님)에 전달하는 것을 좋아합니다.

웹 애플리케이션 프로젝트를 사용하는 경우 디자인 타임에서 프로파일 객체에 액세스 할 수 없습니다. 다음은 당신을 위해 그것을하는 유틸리티입니다. http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx. 개인적으로, 그 유틸리티는 내 프로젝트에서 오류를 일으켜 프로파일베이스에서 상속하기 위해 자신의 프로필 클래스를 굴 렸습니다. 전혀 어렵지 않았습니다.

사용자 정의 클래스 생성을위한 MSDN 연습 (일명 Joel 's Method) :
http://msdn.microsoft.com/en-us/magazine/cc163624.aspx

나는 또한 같은 문제를 겪고있었습니다. 그러나 프로파일베이스에서 상속되는 클래스를 만드는 대신 httpcontext를 사용했습니다.

다음과 같이 web.config 파일에 속성을 지정하십시오.ProfilePropertyWeb.config

이제 다음 코드를 작성하십시오.

Code Behind Profile Properties

코드를 컴파일하고 실행하십시오. 당신은 다음과 같은 출력을 얻을 것입니다 : -

Output

그만큼 웹 프로필 빌더 나를 위해 잘 일했습니다. 그것이 생성 한 클래스는 Joel의 게시물에 의해 설명 된 것보다 훨씬 더 많은 것을 가지고 있습니다. 그것이 실제로 필요하거나 유용한 지 여부는 모른다.

어쨌든 수업을 생성하는 쉬운 방법을 찾는 사람들은 외부 빌드 도구 의존성을 원하지 않는 사람들에게는 항상 가능합니다.

  • 웹 프로필 빌더를 사용하십시오
  • 그것의 모든 흔적을 삭제하십시오!
  • 생성 된 프로필 클래스를 계속 사용하십시오

또는 (테스트되지 않았지만 그냥 작동 할 수 있음)

  • 웹을 만듭니다 대지 프로젝트
  • 요소를 만듭니다
  • 생성 된 클래스를 스냅하여 웹에 복사하십시오. 프로젝트 프로젝트

이 두 번째 접근 방식이 작동하는 경우 누군가가 향후 참조를 위해 저에게 알려줄 수 있습니다.

Joel Spolsky의 대답에 추가하고 싶어요

나는 그의 솔루션을 구현하여 훌륭하게 btw -cudos를 작동시켰다!

내가 사용한 로그인 한 사용자가 아닌 사용자 프로필을 받고 싶은 사람은 다음과 같습니다.

web.config :

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

그리고

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

그리고 내 커스텀 클래스 :

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

매력처럼 작동합니다 ...

훌륭한 게시물,

web.config의 참고 사항 프로파일 요소에 상속 속성을 지정하지 않으면 아래와 같이 Web.config의 프로파일 요소 내부에 각 개별 프로파일 속성을 지정해야합니다.

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

 </properties>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top