it-swarm-ko.tech

ASP.NET MVC에서 프로필 공급자 구현

내 인생에서는 SqlProfileProvider가 내가 작업중 인 MVC 프로젝트에서 작동하도록 할 수 없습니다.

내가 처음 알게 된 것은 Visual Studio가 자동으로 ProfileCommon 프록시 클래스를 생성하지 않는다는 것입니다. ProfileBase 클래스를 확장하는 것은 간단하기 때문에 큰 문제는 아닙니다. ProfileCommon 클래스를 만든 후 사용자 프로필을 만드는 다음과 같은 동작 메서드를 작성했습니다.

[AcceptVerbs("POST")]
public ActionResult CreateProfile(string company, string phone, string fax, string city, string state, string Zip)
{
    MembershipUser user = Membership.GetUser();
    ProfileCommon profile = ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;

    profile.Company = company;
    profile.Phone = phone;
    profile.Fax = fax;
    profile.City = city;
    profile.State = state;
    profile.Zip = Zip;
    profile.Save();

    return RedirectToAction("Index", "Account"); 
}

내가 가지고있는 문제는 ProfileCommon.Create () 호출이 ProfileCommon 유형으로 캐스트 할 수 없으므로 프로파일 객체를 다시 가져올 수 없기 때문에 프로파일이 null이기 때문에 다음 줄이 실패하는 것입니다.

다음은 web.config의 스 니펫입니다.

<profile defaultProvider="AspNetSqlProfileProvider" automaticSaveEnabled="false" enabled="true">
    <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" applicationName="/" />
    </providers>
    <properties>
        <add name="FirstName" type="string" />
        <add name="LastName" type="string" />
        <add name="Company" type="string" />
        <add name="Phone" type="string" />
        <add name="Fax" type="string" />
        <add name="City" type="string" />
        <add name="State" type="string" />
        <add name="Zip" type="string" />
        <add name="Email" type="string" >
    </properties>
</profile>

MembershipProvider가 장애없이 작동하므로 연결 문자열이 양호하다는 것을 알고 있습니다.

도움이되는 경우를 대비하여 ProfileCommon 클래스는 다음과 같습니다.

public class ProfileCommon : ProfileBase
    {
        public virtual string Company
        {
            get
            {
                return ((string)(this.GetPropertyValue("Company")));
            }
            set
            {
                this.SetPropertyValue("Company", value);
            }
        }

        public virtual string Phone
        {
            get
            {
                return ((string)(this.GetPropertyValue("Phone")));
            }
            set
            {
                this.SetPropertyValue("Phone", value);
            }
        }

        public virtual string Fax
        {
            get
            {
                return ((string)(this.GetPropertyValue("Fax")));
            }
            set
            {
                this.SetPropertyValue("Fax", value);
            }
        }

        public virtual string City
        {
            get
            {
                return ((string)(this.GetPropertyValue("City")));
            }
            set
            {
                this.SetPropertyValue("City", value);
            }
        }

        public virtual string State
        {
            get
            {
                return ((string)(this.GetPropertyValue("State")));
            }
            set
            {
                this.SetPropertyValue("State", value);
            }
        }

        public virtual string Zip
        {
            get
            {
                return ((string)(this.GetPropertyValue("Zip")));
            }
            set
            {
                this.SetPropertyValue("Zip", value);
            }
        }

        public virtual ProfileCommon GetProfile(string username)
        {
            return ((ProfileCommon)(ProfileBase.Create(username)));
        }
    }

내가 뭘 잘못하고 있는지에 대한 생각? 나머지는 ProfileProvider와 ASP.NET MVC 프로젝트를 성공적으로 통합 한 적이 있습니까?

미리 감사드립니다 ...

63
senfo

수행해야 할 작업은 다음과 같습니다.

1) Web.config 섹션에서 다른 속성 설정 외에도 "상속"속성을 추가하십시오.

<profile inherits="MySite.Models.ProfileCommon" defaultProvider="....

2) 사용자 정의 ProfileCommon 클래스에서 이미 정의하고 이전 단계에서 사용자 정의 클래스에서 상속하도록 지시 했으므로 Web.config에서 전체 <properties> 섹션을 제거하십시오.

3) ProfileCommon.GetProfile () 메소드의 코드를

public virtual ProfileCommon GetProfile(string username)        
{            
     return Create(username) as ProfileCommon;      
}

도움이 되었기를 바랍니다.

56
Yogesh Prabhu

Web Profile Builder 를 시도하십시오. web.config에서 WebProfile 클래스 (ProfileCommon과 동일)를 자동으로 생성하는 빌드 스크립트입니다.

6
Dave Dunkin

전체 질문에 대해 확실하지 않지만 코드에서 발견 한 한 가지 사항은 다음과 같습니다.

ProfileCommon profile = (ProfileCommon)ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;

(ProfileCommon) 및 as ProfileCommon이 모두 필요하지 않습니다. 둘 다 캐스트를 수행하지만 캐스트를 수행 할 수없는 경우 as는 null을 반환하는 동안 ()가 발생하고 예외가 발생합니다.

6
Mladen Mihajlovic

MVC 베타의 web.config 파일이 잘못되었습니다. SqlProfileProvider는 System.Web.Security가 아니라 System.Web.Profile에 있습니다. 이것을 변경하면 효과가 시작됩니다.

1
Steve Andrews