0

私のアプリケーションには、独自のメンバーを持ついくつかの異なるユーザー タイプがあります。たとえば、学生ユーザーと教師ユーザーがいます。カスタム MembershipProvider の ValidateUser メソッドで Active Directory を介してユーザーを認証します。AD にクエリを実行している間、関連するすべての情報を引き出します。その情報をプロファイルに入れたいのですが、私が読んだことと私が送った例から、単一のプロファイルしか定義できません(そのように):

<profile defaultProvider="CustomProfileProvider" enabled="true">
  <properties>
      <add name="YearLevel" type="String" />
      <add name="Name" type="String" />
      <add name="Age" type="String" />
  </properties>
</profile>

上記のプロファイルは学生には機能しますが、AD の「YearLevel」の値を持たない教師には機能しません。これを達成するために複数のプロファイルを持つことは可能ですか? または、すべてのユーザー タイプにまたがる AD からすべてのプロパティを追加し、コードでユーザー タイプを確認し、特定のプロパティにアクセスする方が簡単ですか?

4

4 に答える 4

1

EDIT 2015-01-26 : うーん... 1つ上げましたが、実際にはそうすべきではなかったと思います。質問と2年以上前の私自身の回答を読み直したので、実際にはプロファイルグループが複数のプロファイル「タイプ」を有効にする方法だとは思いません。おそらく、2 つの異なるタイプのプロパティを 2 つの異なるグループ (少なくとも「直交」プロパティ) に詰め込むことができますが、それでも 2 つを区別するコードが必要です。だから私はapiguyまたはJim Schubertの答えに行きますENDEDIT

これがプロファイル グループの目的ではないでしょうか。お気に入り:

<profile>  
  <properties>  
    <group name="UserInfo">  
      <add name="Name"/>  
      <add name="Age"/>  
    </group>  
    <group name="MemberInfo">  
      <add name="MemberID"/>  
      <add name="JoinDate"/>  
    </group>  
  </properties>  
</profile>
于 2012-12-20T16:43:54.850 に答える
1

ここには 2 つのオプションしかありません。

  1. すべてのユーザー タイプのフィールドを含む「大きな」プロファイルを作成するだけで、現在使用しているユーザー タイプのフィールドにのみアクセスできます。(これはお勧めしませんが、簡単な修正になる可能性があります)。

  2. カスタム プロファイル プロバイダーを実装します。これはまったく難しくありません。詳細については、http: //msdn.microsoft.com/en-us/library/0580x1f5.aspxをご覧ください。

于 2009-09-14T19:20:27.790 に答える
0

オブジェクトを作成して、それをプロファイルに保存できます。例えば:

[Serializable]
public class ProfileObject { }

[Serializable]
class StudentProfile : ProfileObject
{
    public string Year {get;set;}
    public string Name {get;set;}
    public string Age {get;set;}
}

[Serializable]
class TeacherProfile : ProfileObject
{
    public string Department {get;set;}
    public string Tenure {get;set;}
    public string Rating {get;set;}
}

web.configの場合:

<profile>
...
      <properties>
        <add name="UserProfile" allowAnonymous="false" type="ProfileObject" serializeAs="Xml"/>
      </properties>
</profile>

編集:タイプとしてインターフェースを使用できるかどうか思い出せません。オブジェクトに変更しました。

Profile.UserProfileを介してこれにアクセスします(冗長ですが、機能します)。次に、これを処理するには、タイプを確認する必要があります。

if(Profile.UserProfile is StudentProfile) { /* do something */ } else
if(Profile.UserProfile is TeacherProfile) { /* do something */ } // etc.

プロファイルオブジェクトにジェネリックスを格納することもできます(おそらく辞書ですか?以下は私が使用した実装です)

例えば:

namespace Model
{
    [Serializable]
     public class RecentlyViewed : List<Model.Product>
     {
         public RecentlyViewed() {}
     }
 }

そしてweb.configで:

 <profile>
...
      <properties>
        <add name="RecentlyViewed" allowAnonymous="false" type="Model.RecentlyViewed" serializeAs="Xml"/>
      </properties>
</profile>

このメソッドを.NET3.5で使用しましたが、.NET 2または3で機能するかどうかはわかりません。コンパイラーが変更されていないため、ジェネリックスは同じ方法で処理されると思います。

注:プロファイル設定は次のことを好まないため、汎用オブジェクトを空のオブジェクトに継承する必要があります。

<profile>
...
      <properties>
        <add name="RecentlyViewed" allowAnonymous="false" type="System.Collections.Generic.List`1[Model.Product]" serializeAs="Xml"/>
      </properties>
</profile>

上記は、実際に見えるはずの完全修飾IL名です。XMLは目盛りが気に入らないようです。

シリアル化されたオブジェクトをProfileオブジェクトに格納する際のパフォーマンスの問題については調査していません。したがって、かなり定期的に必要になるプロパティには、これをお勧めしません。

于 2010-03-17T01:42:49.823 に答える
0

プロファイル モデルを使用する場合は、考えられるすべてのプロパティを指定する必要があります。そのルートに行く場合は、ユーザーを取得し、そのタイプに基づいて適切なプロパティを設定するある種のプロキシを使用することをお勧めします。

何かのようなもの

public static class ProfileProxy<T>
{
    public static void FillProperties(T user)
    {
        if(user is Teacher)
        {
            //Pull & fill profile properties for teacher
        }
        else
        {
            //Pull & fill profile properties for student
        }
    }
}

ただし、2 つのオブジェクトを別々に保持するか、カスタム プロファイル プロバイダーを実装する 2 つの異なるテーブルを用意することを検討します。

于 2009-09-14T19:28:29.160 に答える