0

我的应用程序有几种不同的用户类型,它们都有自己的成员。例如,我有学生用户和教师用户。我通过自定义 MembershipProvider 的 ValidateUser 方法中的活动目录对我的用户进行身份验证。在查询 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

编辑 2015-01-26:嗯......我刚刚升了 1,但我实际上认为它不应该是。现在我重新阅读了两年多前的问题和我自己的答案,我实际上认为个人资料组是启用多种个人资料“类型”的方式。您也许可以将两种不同类型的属性填充到两个不同的组中(至少是“正交”属性),但您仍然需要代码来区分两者。所以我会选择 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

你真的只有两个选择:

  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>

我在 .NET 3.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
        }
    }
}

我会考虑拥有两个不同的表,尽管它们将两个对象分开,或者实现一个自定义配置文件提供程序。

于 2009-09-14T19:28:29.160 回答