0

MVC4を使用していて、プロファイルにいくつかの値を保存したいと思います。

どして

TempData["badgerName"] = Profile.BadgerName;

ProfileBaseにはBadgerNameの定義が含まれていないと言いますか?

以下のようにプロファイルを設定しました。

<profile defaultProvider="DefaultProfileProvider">
  <providers>
    <add 
      name="DefaultProfileProvider" 
      type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      connectionStringName="FALContext" 
      applicationName="/" />
  </providers>
  <properties>
    <add name="BadgerName" type="String"/>
  </properties>
</profile>
4

1 に答える 1

1

ASP MVCでは、web.configファイルで定義されたプロパティを使用してサイト用に生成されたプロファイルオブジェクトはありません。ProfileコントローラメソッドからアクセスできるプロパティはタイプProfileBasemsdnを参照)であり、カスタムプロファイルプロパティの厳密に型指定されたプロパティは含まれていません。ご存知かもしれませんが、このプロファイルは、リクエストの開始時にログインしたユーザーに対してロードされ、変更はリクエストの終了時に保存されます。

クラスで作業する方法はいくつかあります。ProfileBase最もよく使用されるものは次のとおりです。

  • ProfileBaseクラスを直接使用する
  • 派生したカスタムプロファイルクラスを作成します。

を直接使用する場合ProfileBaseは、コントローラーメソッドからインスタンスを使用するか、ユーザー名を指定してインスタンスを取得する必要があります。次に、インデクサーを使用してプロファイルのプロパティにアクセスする必要があります。コントローラメソッドが、電子メールやBadgerNameなどのユーザーデータを含むUserModelタイプのオブジェクトを受け取ったとすると、次のようなコードを記述できます。

//Getting the instance from the controller property:
ProfileBase profile = this.Profile; //or even: this.HttpContext.Profile
//You can also get the profile for a given existing user.
ProfileBase profile = ProfileBase.Create(userModel.Name);

//Then update properties using indexer 
profile["Email"] = userModel.Email;
profile["BadgerName"] = userModel.BadgerName; 
//Manually save changes
//(Can be skipped for the profile automatically loaded in the Controller)
profile.Save();

ただし、から派生クラスを作成するProfileBaseと、当初の意図とほぼ同じ方法でクラスを使用することになります。基本的に、インデクサーを使用してProfileBaseに内部的にアクセスする強い型のプロパティを持つラッパークラスを作成します(アプローチの概要はここにあります)。

public class MyCustomProfile : ProfileBase
{                       
    public string Email
    {     
        get { return base["Email"] as string; }     
        set { base["Email"] = value; }
    }

    public string BadgerName
    {     
        get { return base["BadgerName"] as string; }     
        set { base["BadgerName"] = value; }
    }

    //If needed, you can provide methods to recover profiles 
    //for the logged in user or any user given its user name
    public static MyCustomProfile GetCurrent()
    {
        return Create(Membership.GetUser().UserName) as MyCustomProfile;
    }

    public static MyCustomProfile GetProfile(string userName)     
    {
        return Create(userName) as MyCustomProfile;     
    }
}

このオプションを使用する場合<profile>は、web.configの要素にinheritsカスタムモデルクラスに設定された属性があることも確認する必要があります。

<profile enabled="true" defaultProvider="DefaultProfileProvider" inherits="yourNamespace.MyCustomProfile">

このコードと構成を設定したら、ユーザープロファイルを自分で回復するか、コントローラーのProfileプロパティをカスタムクラスにキャストすることで、カスタムプロファイルクラスの使用を開始できます。

//Cast the Profile property of the controller to your custom class
MyCustomProfile profile = this.Profile as MyCustomProfile // or even: HttpContext.Profile as MyCustomProfile
//You could also manually load the profile for given an user name 
profile = MyCustomProfile.GetProfile(userModel.Name); 
//Or even manually load the profile for the logged in user
profile = MyCustomProfile.GetCurrent();

//Now get/set the profile properties using the strongly typed properties of your class
profile.Email= userModel.Email;
profile.BadgerName= userModel.BadgerName;
//Manually save changes
//(Can be skipped for the profile automatically loaded in the Controller)
profile.Save();

お役に立てれば!

于 2013-02-28T20:38:40.020 に答える