覆盖角色提供程序 - ASP.NET

时间:2009-10-15 13:50:52

标签: c# asp.net asp.net-membership

编辑:通过覆盖RoleProvider,我们希望仍然使用与我们的新方法相同的方法。例如Roles.GetRolesForUser(int)。

 string[] myRoles3 = ((PortalRoleProvider) (Roles.Provider)).GetRolesForUser(2);

上面的代码看起来有点过分了吗?

我有一个类会覆盖RoleProvider的某些成员并添加新方法。例如

 public string[] GetRolesForUser(int UserId)
    {
        IEnumerable<Role> RoleList = _Repo.GetRolesForUser(UserId);


        string[] RetVal = new string[] {};

        foreach (var curRole in RoleList)
        {
            RetVal[RetVal.GetUpperBound(0)] = curRole.RoleName;
        }
        return RetVal;
    }

现在,当我处理我的代码逻辑时,我想编写Roles.GetRolesForUser(2),但是当我输入它时,它似乎确实看到了我添加的额外方法。这是类声明和webconfig。

 namespace PortalMVC.Providers
 {
    public class PortalRoleProvider : RoleProvider
    {

的Web.config

<roleManager enabled="true" defaultProvider="PortalRoleProvider">
    <providers>
        <clear/>
         <add name="PortalRoleProvider" type="PortalMVC.Providers.PortalRoleProvider"/>
    </providers>
</roleManager>

为什么会这样?

2 个答案:

答案 0 :(得分:2)

您必须将RoleProvider转换为实际的对象类型(即PortalRoleProvider)以查看额外的功能。这适用于您扩展标准对象但正在访问它的超级类(母版页等)的任何时候。

string[] myRoles3 = ((PortalRoleProvider) (Roles.Provider)).GetRolesForUser(2);

正如您在帖子中指出的那样,上述内容有效。如果你需要在代码段中大量使用它,你可以创建一个具有正确类型的指针,然后从那里访问方法:

PortableRoleProvider TempPointer=(PortableRoleProvider)Roles.Provider;

string[] myRoles3=TempPointer.GetRolesForUser(2);

答案 1 :(得分:1)

在web.config中,您可以在其中指定角色提供程序的类型,您可能需要添加可以找到类型的程序集的名称。像这样:

<add name="PortalRoleProvider" type="PortalMVC.Providers.PortalRoleProvider, MyAssemblyName" />