我正在try 创建一个自定义ActionFilter,它对控制器传递给它的一组参数进行操作.

到目前为止,我的客户ActionFilter如下所示:

public class CheckLoggedIn : ActionFilterAttribute
{
    public IGenesisRepository gr { get; set; }
    public Guid memberGuid { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Member thisMember = gr.GetActiveMember(memberGuid);
        Member bottomMember = gr.GetMemberOnBottom();

        if (thisMember.Role.Tier <= bottomMember.Role.Tier)
        {
            filterContext
                .HttpContext
                .Response
                .RedirectToRoute(new { controller = "Member", action = "Login" });
        }

        base.OnActionExecuting(filterContext);
    }
}

我知道我仍然需要判断空值等,但我不明白为什么grmemberGuid不能成功通过.我这样称呼这个过滤器:

    [CheckLoggedIn(gr = genesisRepository, memberGuid = md.memberGUID)]
    public ActionResult Home(MemberData md)
    {
        return View(md);
    }

控制器的构造函数中设置了genesisRepositorymd.

我无法编译这个.我得到的错误是:

Error   1   'gr' is not a valid named attribute argument because it is not a valid attribute parameter type
Error   2   'memberGuid' is not a valid named attribute argument because it is not a valid attribute parameter type

我仔细判断了grmemberGuidgenesisReporitymd.memberGUID是同一类型,是什么导致了这些错误?

解决方案

感谢jfa提供了解决方案.

以下是我最终使用的过滤器:

public class CheckLoggedIn : ActionFilterAttribute
{

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var thisController = ((MemberController)filterContext.Controller);

        IGenesisRepository gr = thisController.GenesisRepository;
        Guid memberGuid = ((MemberData)filterContext.HttpContext.Session[thisController.MemberKey]).MemberGUID;

        Member thisMember = gr.GetActiveMember(memberGuid);
        Member bottomMember = gr.GetMemberOnBottom();

        if (thisMember.Role.Tier >= bottomMember.Role.Tier)
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new { 
                        controller = "Member", 
                        action = "Login" 
                    }));
        }

        base.OnActionExecuting(filterContext);
    }
}

推荐答案

这是实现这一目标的一种方式.您可以从ActionFilter对象访问ControllerContext,因此也可以访问Controller.您只需将控制器强制转换为该类型,即可访问任何公共成员.

在给定此控制器的情况下:

public GenesisController : Controller
{
    [CheckLoggedIn()]
    public ActionResult Home(MemberData md)
    {
        return View(md);
    }
}

ActionFilter看起来像

public class CheckLoggedIn : ActionFilterAttribute
{
    public IGenesisRepository gr { get; set; }
    public Guid memberGuid { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        /* how to get the controller*/
        var controllerUsingThisAttribute = ((GenesisController)filterContext.Controller);

        /* now you can use the public properties from the controller */
        gr = controllerUsingThisAttribute .genesisRepository;
        memberGuid = (controllerUsingThisAttribute .memberGuid;

        Member thisMember = gr.GetActiveMember(memberGuid);
        Member bottomMember = gr.GetMemberOnBottom();

        if (thisMember.Role.Tier <= bottomMember.Role.Tier)
        {
            filterContext
                .HttpContext
                .Response
                .RedirectToRoute(new { controller = "Member", action = "Login" });
        }

        base.OnActionExecuting(filterContext);
    }
}

当然,这是假设ActionFilter没有跨多个控制器使用,并且您可以接受耦合.另一种 Select 是使用共享属性创建一个ICheckedLoggedInController接口,然后简单地转换为该接口.

Asp.net相关问答推荐

ASP.NET MVC forEach 循环仅返回 1 个值

Thread.CurrentPrincipal 错误地声称是匿名的

如何在运行时判断动态数据类型的类型?

Dotnet core 2.0 身份验证多模式身份 cookie 和 jwt

如何使用 javascript 获取 MVC 应用程序的基本 URL

如何从 web.config 中读取系统值并在 ASP.NET MVC C# 方法中使用

从 GUID 中删除破折号是个好主意吗?

如何将 css 类添加到 ASP.Net 中的更新面板?

在 asp.net 中调整图像大小而不会丢失图像质量

当用户使表单无效时单击取消按钮时,如何清除 MVC 客户端验证错误?

如何设置 CSS 切换器

Asp.net 中的下拉列表验证使用必填字段验证器

在生产中使用 LocalDb 是否正常?

实体框架:如何解决外键约束可能导致循环或多个级联路径?

有条件地排除 ASP.NET WebForms 中的一个 html 块

捕获的异常本身为 null !

对于 DB ID,需要一个较小的 GUID 替代方案,但对于 URL 仍然是唯一且随机的

将 html 标记从 jquery 发布调用发送到 asp.net 页面时,从客户端检测到潜在危险的 Request.QueryString 值

IsMobileDevice 是如何工作的?

使用 FormsAuthentication.SetAuthCookie 存储更多信息