내가 무엇을 놓치고 있는지 모르겠지만 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();
위의 내용은 동적 유형을 사용하는 데 익숙하고 컴파일 시간 검사 및 인텔리전스가 부족한 경우에도 잘 작동합니다.
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>
또는 프로그래밍 방식으로 ProfileSection 을 인스턴스화하고 ProfilePropertySettings 및 ProfilePropertySettingsColletion을 사용하여 개별 속성을 만들어 프로필 섹션을 만듭니다.이 모든 항목은 System.Web.Configuration 네임 스페이스에 있습니다. 프로필의 이러한 속성을 사용하려면 System.Web.Profile.ProfileBase 개체를 사용합니다. 프로필 속성은 프로필로 액세스 할 수 없습니다 . 위에서 언급 한 구문이지만 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에서 파생되는 클래스를 작성하거나 Web.Config의 정의에서 클래스를 생성 할 수있는 Web Profile Builder (WPB)를 설치합니다. 나는 잠시 동안 WPB를 사용해 왔으며 지금까지 기대 한 바를 수행했습니다. 속성이 많은 경우 WPB를 사용하면 시간을 상당히 절약 할 수 있습니다.
- Web.Config에서 데이터베이스 연결이 올바르게 구성되었는지 확인하십시오.
- 이제 컨트롤러에서 프로필 클래스의 인스턴스를 만들도록 설정되었습니다.
- 보기에 프로필 속성 값이 필요할 수 있습니다. 개별 속성이 아닌보기에 프로필 개체 자체를 전달하고 싶습니다.
답변
웹 응용 프로그램 프로젝트를 사용하는 경우 디자인 타임에 바로 사용할 수있는 프로필 개체에 액세스 할 수 없습니다. 다음은 당신을위한 유틸리티입니다 : http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx . 개인적으로 그 유틸리티는 내 프로젝트에서 오류를 일으켜 ProfileBase에서 상속하기 위해 내 자신의 프로필 클래스를 롤링했습니다. 전혀 어렵지 않았습니다.
답변
사용자 지정 클래스 (Joel의 메서드라고도 함) 만들기를위한 MSDN 연습 :
http://msdn.microsoft.com/en-us/magazine/cc163624.aspx
답변
나는 또한 같은 문제를 겪고 있었다. 그러나 ProfileBase에서 상속하는 클래스를 만드는 대신 HttpContext를 사용했습니다.
web.config 파일에서 다음과 같이 속성을 지정합니다.-
이제 다음 코드를 작성하십시오.-
코드를 컴파일하고 실행합니다. 다음과 같은 출력이 표시됩니다.-