63

私の人生では、私が取り組んでいる MVC プロジェクトで SqlProfileProvider を動作させることはできません。

最初に気付いた興味深い点は、Visual Studio は ProfileCommon プロキシ クラスを自動的に生成しないということです。これは、ProfileBase クラスを拡張するだけの問題であるため、大したことではありません。ProfileCommon クラスを作成した後、ユーザー プロファイルを作成するための次の Action メソッドを記述しました。

[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 プロジェクトにうまく統合した人はいますか?

前もって感謝します...

4

4 に答える 4

56

必要な作業は次のとおりです。

1) Web.config のセクションで、他の属性設定に加えて「継承」属性を追加します。

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

2) Web.config からセクション全体を削除<properties>します。これは、カスタム ProfileCommon クラスでセクションを既に定義しており、前の手順でカスタム クラスから継承するように指示したためです。

3) ProfileCommon.GetProfile() メソッドのコードを次のように変更します。

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

お役に立てれば。

于 2009-01-12T08:25:20.520 に答える
6

質問全体についてはわかりませんが、コードで気付いたことが1つあります。

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

(ProfileCommon) と as ProfileCommon の両方は必要ありません。どちらもキャストを行いますが、() は例外をスローし、キャストができない場合は as が null を返します。

于 2008-09-17T06:45:13.877 に答える
6

Web Profile Builderを試してみてください。これは、web.config から WebProfile クラス (ProfileCommon に相当) を自動的に生成するビルド スクリプトです。

于 2008-09-18T16:06:42.990 に答える
1

MVC ベータ版の web.config ファイルが間違っています。SqlProfileProvider は、System.Web.Security ではなく、System.Web.Profile にあります。これを変更すると、機能し始めるはずです。

于 2008-11-04T04:53:02.097 に答える