プロファイル値を割り当てる方法は?
-
06-07-2019 - |
質問
不足しているものがわかりませんが、Web.configファイルにプロファイルプロパティを追加しましたが、コードのProfile。 Item にアクセスしたり、新しいプロファイルを作成したりできません。
解決
今日も同じ問題があり、多くを学びました。
Visual Studioには2種類のプロジェクトがあります-<!> quot; Webサイトプロジェクト<!> quot;および<!> quot; Webアプリケーションプロジェクト。<!> quot;私にとって完全な謎である理由により、Webアプリケーションプロジェクトは Profile。を直接使用できません。強く型付けされたクラスは、Web.configファイルから魔法のように生成されないので、自分で転がしてください。
MSDNのサンプルコードは、Webサイトプロジェクトを使用していることを前提としています。また、<profile>
セクションをWeb.config
に追加し、Profile.
プロパティでパーティを開始するよう指示しています。ただし、Webアプリケーションプロジェクトでは機能しません。
自分でロールバックするには2つの選択肢があります:
(1) Webプロファイルビルダーを使用します。これはVisual Studioに追加するカスタムツールで、Web.configの定義から必要なプロファイルオブジェクトを自動的に生成します。
この余分なツールに依存してコードをコンパイルしたくないため、これを行わないことを選択しました。これにより、他の誰かが必要なことに気づかずにコードをビルドしようとしたときに問題を引き起こす可能性がありましたこのツール。
(2)ProfileBase
から派生する独自のクラスを作成して、カスタムプロファイルを表します。これは見た目よりも簡単です。 <!> quot; FullName <!> quot;を追加する非常に単純な例です。文字列プロファイルフィールド:
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;
他のヒント
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ヘルパーメソッドは<!> quot; model <!> quotではうまく動作しないため、動的プロファイルオブジェクトをビューに渡す場合、追加の作業を行う必要があります;動的なオブジェクト。 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アプリケーションプロジェクトでも使用できます。 プロパティは、設計時またはプログラムで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 を使用して個々のプロパティを作成することにより、プロファイルセクションを作成します。これらはすべてシステムにあります.Web.Configuration名前空間。 プロファイルのこれらのプロパティを使用するには、System.Web.Profile.ProfileBaseオブジェクトを使用します。上記のように、 profile。構文を使用してプロファイルプロパティにアクセスすることはできませんが、ProfileBaseをインスタンス化し、 SetPropertyValue (<!> quot; PropertyName <!> quot;)および GetPropertyValue {<!> quot; PropertyName <!> quot;)は次のとおりです。
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で新しいWebサイトプロジェクトを作成すると、Profileから返されるオブジェクトが(自動的に)生成されます。 WebアプリケーションプロジェクトまたはMVCプロジェクトを作成する場合、独自のロールを作成する必要があります。
これはおそらくそれよりも難しいように思われます。次のことを行う必要があります。
- aspnet_regsql.exe を使用してデータベースを作成します。このツールは、.NETフレームワークとともにインストールされます。
- ProfileGroupBaseから派生するクラスを作成するか、Web.Configの定義からクラスを生成できるWeb Profile Builder(WPB)をインストールします。私はしばらくの間WPBを使用してきましたが、これまで期待されていたことを実行しました。多数のプロパティがある場合、WPBを使用するとかなりの時間を節約できます。
- データベースへの接続がWeb.Configで適切に構成されていることを確認します。
- (コントローラーで)プロファイルクラスのインスタンスを作成するように設定されました
- おそらく、ビューにプロファイルプロパティ値が必要になります。プロファイルオブジェクト自体をビューに渡すのが好きです(個々のプロパティではありません)。
Webアプリケーションプロジェクトを使用している場合は、設計時にすぐにプロファイルオブジェクトにアクセスできません。おそらくあなたのためにそれを行うユーティリティがあります: 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ファイルでプロパティを指定します。-
今、次のコードを書きます:-
コードをコンパイルして実行します。次の出力が得られます。-
Webプロファイルビルダーは、私にとっては非常に役立ちました。生成されたクラスには、Joelの投稿で説明されているものよりも多くのものが含まれています。実際に必要であるか有用であるかどうかはわかりません。
とにかく、クラスを簡単に生成する方法を探しているが、外部ビルドツールの依存関係を持ちたくない場合はいつでも
- ウェブプロファイルビルダーを使用
- すべての痕跡を削除する
- 生成されたプロファイルクラスを使用し続ける
OR(テストされていないが機能する可能性がある)
- ウェブサイトプロジェクトを作成
- 要素を作成
- 生成されたクラスをスナップして、Web project プロジェクトにコピーします
この2番目のアプローチが機能する場合、誰かが将来の参考のために私に知らせることができます
Joel Spolskyの答えに加えたいだけです
私は彼のソリューションを実装しましたが、すばらしい結果が得られました-Cudos!
使用したログインユーザーではないユーザープロファイルを取得したい場合:
web.config:
<connectionStrings>
<clear />
<add name="LocalSqlConnection" connectionString="Data Source=***;Database=***;User Id=***;Password=***;Initial Catalog=***;Integrated Security=false" providerName="System.Data.SqlClient" />
</connectionStrings>
and
<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(); }
}
}
}
チャームのように動作します...
素晴らしい投稿、
web.configに注意してください プロファイル要素でinherit属性を指定しない場合 プロファイル内の各個別プロファイルプロパティを指定する必要があります 以下のweb.configの要素
<properties>
<clear/>
<add name="property-name-1" />
<add name="property-name-2" />
..........
</properties>