可以在ASP.NET中为不同的用户使用多个配置文件吗?

时间:2009-09-14 19:14:23

标签: asp.net asp.net-profiles

我的应用程序有几个不同的用户类型和自己的成员。例如,我有学生用户和教师用户。我通过自定义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 个答案:

答案 0 :(得分:1)

这里你真的只有2个选项:

  1. 您可以使用所有用户类型的字段创建“大”个人资料,然后只访问您当前使用的用户类型的字段。 (我不推荐这个,但它可以快速解决。)

  2. 实施自定义配置文件提供程序 - 这根本不是那么难。您可以在此处了解有关此内容的更多信息:http://msdn.microsoft.com/en-us/library/0580x1f5.aspx

答案 1 :(得分:1)

编辑2015-01-26 :嗯...我刚刚起步1,但我认为不应该这样。现在我重读了2年前的问题和我自己的答案,我实际上不要认为配置文件组是启用多个配置文件“类型”的方法。您可以将两种不同类型的属性填充到两个不同的组中(至少是“正交”属性),但您仍需要代码来区分这两者。所以我会选择apiguy或Jim Schubert的答案 ENDEDIT

这不是profile groups的用途吗?像:

<profile>  
  <properties>  
    <group name="UserInfo">  
      <add name="Name"/>  
      <add name="Age"/>  
    </group>  
    <group name="MemberInfo">  
      <add name="MemberID"/>  
      <add name="JoinDate"/>  
    </group>  
  </properties>  
</profile>

答案 2 :(得分: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
        }
    }
}

我会考虑使用两个不同的表来保持两个对象分开,或者实现自定义配置文件提供程序。

答案 3 :(得分: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.

您还可以在配置文件对象中存储泛型(也许是Dictionary?以下是我使用过的实现)

例如:

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对象中存储序列化对象的任何性能问题,因此我不会建议您定期使用所需的任何属性。