web-dev-qa-db-ja.com

プロファイル値を割り当てる方法は?

何が欠けているのかわかりませんが、Web.configファイルにプロファイルプロパティを追加しましたが、プロファイルにアクセスできません。Itemコードで、または新しいプロファイルを作成します。

110
zsharp

今日も同じ問題があり、多くのことを学びました。

Visual Studioには、「Webサイトプロジェクト」と「Webアプリケーションプロジェクト」という2種類のプロジェクトがあります。私にとって完全な謎であるため、WebアプリケーションプロジェクトはProfile。を直接使用できません...強く型付けされたクラスは魔法のように生成されませんWeb.configファイルからので、独自にロールする必要があります。

MSDNのサンプルコードでは、Webサイトプロジェクトを使用していることを想定しており、<profile>セクションをWeb.configProfile.property、ただし、Webアプリケーションプロジェクトでは機能しません。

独自にロールするには、2つの選択肢があります。

(1) Web Profile Builder を使用します。これはVisual Studioに追加するカスタムツールで、Web.configの定義から必要なプロファイルオブジェクトを自動的に生成します。

コードをこの追加ツールに依存してコンパイルしたくないため、これを行わないことを選択しました。このツールは、このツールが必要であることに気づかずにコードをビルドしようとしたときに、他の誰かに問題を引き起こす可能性がありました。

(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;
178
Joel Spolsky

Webアプリケーションプロジェクトは、実行時にのみ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クラスを生成しようとすると、コンパイラエラーが発生します。

17
colivier

プロファイルは、Webアプリケーションプロジェクトでも使用できます。プロパティは、設計時またはプログラムで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にあります。構成名前空間。プロファイルのこれらのプロパティを使用するには、System.Web.Profile.ProfileBaseオブジェクトを使用します。上記のように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();
13

Visual Studioで新しいWebサイトプロジェクトを作成すると、Profileから返されるオブジェクトが(自動的に)生成されます。 WebアプリケーションプロジェクトまたはMVCプロジェクトを作成する場合、独自のロールを作成する必要があります。

これはおそらくそれよりも難しいように聞こえます。以下を行う必要があります。

  • aspnet_regsql.exeを使用してデータベースを作成します。このツールは、.NETフレームワークと共にインストールされます。
  • ProfileGroupBaseから派生するクラスを作成するか、Web.Configの定義からクラスを生成できるWeb Profile Builder(WPB)をインストールします。私はしばらくの間WPBを使用してきましたが、これまで期待されていたことを実行しました。多くのプロパティがある場合、WPBを使用するとかなりの時間を節約できます。
  • データベースへの接続がWeb.Configで適切に構成されていることを確認してください。
  • これで、プロファイルクラスのインスタンスを作成するように設定されました(コントローラー内)
  • おそらく、ビューにプロファイルプロパティ値が必要になります。プロファイルオブジェクト自体をビューに渡すのが好きです(個々のプロパティではありません)。
8

Webアプリケーションプロジェクトを使用している場合は、設計時にすぐにプロファイルオブジェクトにアクセスできません。これはおそらくあなたのためにそれを行うユーティリティです: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx 。個人的に、そのユーティリティは私のプロジェクトでエラーを引き起こしたので、ProfileBaseから継承するために自分のプロファイルクラスをロールすることになりました。全然難しくありませんでした。

3
nshaw

カスタムクラス(別名、Joelのメソッド)を作成するためのMSDNウォークスルー:
http://msdn.Microsoft.com/en-us/magazine/cc163624.aspx

2
Even Mien

私も同じ問題を経験していました。しかし、ProfileBaseから継承するクラスを作成する代わりに、HttpContextを使用しました。

次のようにweb.configファイルでプロパティを指定します。- ProfilePropertyWeb.config

次に、次のコードを記述します。-

Code Behind Profile Properties

コードをコンパイルして実行します。次の出力が得られます。-

Output

2
Anil Purswani

ジョエル・スポルスキーの答えに加えたいだけです

私は彼のソリューションを実装しました。

私が使用したログインユーザーではないユーザープロファイルを取得したい場合:

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

チャームのように動作します...

1
Kickass

Web Profile Builder は、私にとってはうまくいきました。生成されたクラスには、Joelの投稿で説明されているものよりも多くのものが含まれています。実際に必要であるか有用であるかどうかはわかりません。

とにかく、クラスを生成する簡単な方法を探しているが、外部ビルドツールの依存関係を持ちたくない場合はいつでも

  • webプロファイルビルダーを使用する
  • その痕跡をすべて削除してください!
  • 生成されたプロファイルクラスを使用し続ける

または(テストされていませんが、動作する可能性があります)

  • websiteプロジェクトを作成します
  • 要素を作成する
  • 生成されたクラスをスナップして、Webprojectプロジェクトにコピーします

この2番目のアプローチが機能する場合、誰かが将来の参考のために私に知らせることができます

1
Simon_Weaver

素晴らしい投稿、

プロファイル要素でinherit属性を指定しない場合は、web.configに注意してください。web.configのプロファイル要素内の各個別プロファイルプロパティを以下のように指定する必要があります。

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

 </properties>
0
indy