3

我在用

If(User.IsInRole("member"))
{

}

但无法让它在 C# MVC 类中工作。请注意,我没有在能够工作的控制器中使用它。我错过了什么?该代码甚至无法识别用户是什么。

我认为它可能是一个命名空间,但我已经使用了.Mvc命名空间以及其他......

先感谢您

4

3 回答 3

7

HttpContext.Current.User改为使用

于 2013-01-10T13:32:32.870 回答
4

这是一种方法(在耦合方面是正确的,但它违反了单一责任原则):

if (Roles.IsUserInRole("member"))
{

}

基本上在这里,您使用的是Roles.IsUserInRole静态方法,该方法又使用您在<roles>web.config 部分中配置的角色提供程序来获取当前经过身份验证的用户的角色。

但这不是我建议您采用的方法。角色和成员资格提供者之类的内容应该特定于您的 Web 层。您的业​​务课程不应该为检索此信息而烦恼。此信息应作为参数传递给他们。

例如,如果此类的所有方法都需要此信息,您可以简单地使用构造函数注入:

public class MyClass
{
    private readonly bool _isCurrentUserAMember;
    public MyClass(bool isCurrentUserAMember)
    {
        _isCurrentUserAMember = isCurrentUserAMember;
    }

    public void SomeMethod()
    {
        if (_isCurrentUserAMember)
        {
            // do some business logic for members
        }
        else
        {
            // do some other business logic for non-members
        }
    }
}

正如您在这里看到的那样,这个类关心的是当前用户是否是成员以便执行他的业务逻辑,对吧?这个类不关心如何获取这些信息。这不是它的责任,如果你开始从类中获取它,你就违反了单一职责原则,这非常重要,因为现在你的类正在做两件事:检索角色信息和执行业务逻辑。

通过我推荐的方法,我们将这种责任倒转给调用代码,在这种情况下,调用代码通常恰好是一个 MVC 控制器,它可以查询角色提供者,如我的第一个示例所示,并将其传递给底层类。

如果这个类有更多的方法,而其他方法不需要这些信息,你也可以将布尔参数作为参数传递给方法,而不是使用构造函数注入。

于 2013-01-10T13:37:58.883 回答
0

用这个System.Web.HttpContext.Current.User.IsInRole("yourRole")

于 2017-11-20T14:24:04.290 回答