何が欠けているのかわかりませんが、プロファイル プロパティを Web.config ファイルに追加しましたが、プロファイルにアクセスできません。コード内のアイテムまたは新しいプロファイルを作成します。
10 に答える
今日も同じ問題があり、たくさんのことを学びました。
Visual Studioには、「Webサイトプロジェクト」と「Webアプリケーションプロジェクト」の2種類のプロジェクトがあります。私には完全に謎の理由で、Webアプリケーションプロジェクトはプロファイルを使用できません。直接...強く型付けされたクラスはWeb.configファイルから魔法のように生成されないため、独自のクラスを作成する必要があります。
MSDNのサンプルコードは、Webサイトプロジェクトを使用していることを前提としており、プロパティを使用してパーティーに<profile>
セクションを追加するように指示されていますが、Webアプリケーションプロジェクトでは機能しません。Web.config
Profile.
あなたはあなた自身を転がすために2つの選択肢があります:
(1)WebProfileBuilderを使用します。これは、Visual Studioに追加するカスタムツールであり、Web.configの定義から必要なプロファイルオブジェクトを自動的に生成します。
私はこれを行わないことを選択しました。コードをコンパイルするためにこの追加のツールに依存させたくなかったためです。これにより、他の誰かがこのツールが必要であることに気付かずにコードをビルドしようとしたときに問題が発生する可能性がありました。
ProfileBase
(2)カスタムプロファイルを表すために派生する独自のクラスを作成します。これは見た目よりも簡単です。「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;
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 クラスを生成しようとしたときにコンパイラ エラーを出します。
Visual Studio で新しい Web サイト プロジェクトを作成すると、Profile から返されるオブジェクトが (自動的に) 生成されます。Web アプリケーション プロジェクトまたは MVC プロジェクトを作成するときは、独自のプロジェクトを作成する必要があります。
これはおそらく、実際よりも難しく聞こえます。次のことを行う必要があります。
- aspnet_regsql.exeを使用してデータベースを作成するこのツールは、.NET フレームワークと共にインストールされます。
- ProfileGroupBase から派生するクラスを作成するか、Web.Config の定義からクラスを生成できる Web プロファイル ビルダー (WPB) をインストールします。私はしばらくの間 WPB を使用してきましたが、今までは期待通りの動作をしていました。多くのプロパティがある場合、WPB を使用するとかなりの時間を節約できます。
- データベースへの接続が Web.Config で適切に構成されていることを確認します。
- これで、(コントローラーで) プロファイル クラスのインスタンスを作成するように設定されました。
- おそらく、ビューでプロファイル プロパティの値が必要になるでしょう。プロファイル オブジェクト自体を (個々のプロパティではなく) ビューに渡すのが好きです。
Web アプリケーション プロジェクトを使用している場合、そのままでは設計時に Profile オブジェクトにアクセスできません。これは、おそらくあなたのためにそれを行うユーティリティです: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx。個人的には、そのユーティリティが私のプロジェクトでエラーを引き起こしたので、ProfileBase から継承するように独自のプロファイル クラスを展開することになりました。それはまったく難しいことではありませんでした。
私も同じ問題を抱えていました。ただし、ProfileBase から継承するクラスを作成する代わりに、HttpContext を使用しました。
次のように web.config ファイルでプロパティを指定します。
ここで、次のコードを書きます: -
コードをコンパイルして実行します。次の出力が得られます: -
カスタム クラスを作成するための MSDN ウォークスルー (別名 Joel の方法):
http://msdn.microsoft.com/en-us/magazine/cc163624.aspx
Web Profile Builderは私にとって非常に効果的でした。生成されたクラスには、Joel の投稿で説明されているよりも多くの機能が含まれています。それが実際に必要かどうか、または有用かどうかはわかりません。
とにかく、クラスを生成する簡単な方法を探しているが、外部ビルド ツールの依存関係を持ちたくない場合は、いつでもできます。
- ウェブ プロファイル ビルダーを使用する
- その痕跡をすべて削除してください!
- 生成された Profile クラスを使い続ける
または (テストされていませんが、動作する可能性があります)
- Webサイトプロジェクトを作成する
- あなたの要素を作成します
- 生成されたクラスをスナップして、Webプロジェクトプロジェクトにコピーします
この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>
と
<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(); }
}
}
}
魅力のように動作します...
素晴らしい投稿、
profile 要素で inherit 属性を指定しない場合は、web.config に注意してください。以下のように、web.config の profile 要素内に個々のプロファイル プロパティを指定する必要があります。
<properties>
<clear/>
<add name="property-name-1" />
<add name="property-name-2" />
..........
</properties>