asp.net-mvc-3 - 如何开发特定的 Action 过滤 Controller 或 Action 方法

标签 asp.net-mvc-3 cookies custom-action-filter

我正在尝试开发一个自定义操作过滤器,它将检查 cookie 是否启用。如果 cookie 未启用,则将使用重定向到特定的错误页面。这是我的代码。

public class CheckCookieAttribute : FilterAttribute, IActionFilter
    {

       public string prmAction{get;set;}

       public string prmController{get;set;}


        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
        if(filterContext.HttpContext.Request.Cookie["YourCookie"]==null)
        {
            filterContext.Result = controller.RedirectToAction(prmAction,prmController)
        }
        }

        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //The action filter logic - after
        }
    }

现在我正在使用类似

[CheckCookie(prmAction="MyAction",prmController="MyController")]

由于缺乏良好的知识,我无法开发属性驱动的 cookie 启用或禁用检查。

我想以这种方式开发代码,因此我不应该传递任何 Controller 名称或操作名称。我喜欢使用类似的代码

[HttpPost]
 [CheckCookieAttribute]
 public ActionResult Save(Person oPerson)
 {
        return View();
 }

[CheckCookieAttribute]
public class HomeController : Controller
{
public ActionResult Index()
{return View();}

public ActionResult About()
{return View();}
}
}

我不会提供任何 Controller 名称或操作名称。只是指导我需要在代码中更改哪些内容。谢谢

最佳答案

看来您想要完成的任务已经内置到 ASP.NET MVC 中。

我会使用 [Authorize] 属性 ( http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.108).aspx ) 来检查用户是否有 cookie。

如果您想在用户未授权时将用户重定向到特定的 Controller /操作,可以使用以下属性:

public class AuthorizeUserAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new
                    {
                        controller = "Error",
                        action = "Unauthorized"
                    })
                );
    }
}

参见ASP.NET MVC 4 Custom Authorize Attribute with Permission Codes (without roles)

然后你可以使用它:

[HttpPost]
[AuthorizeUser]
public ActionResult Save(Person oPerson)
{
    return View();
}

或者,如果您想要的正是您所要求的,可以这样做:

public class CheckCookieAttribute : ActionFilterAttribute, IActionFilter
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Request.Cookies["YourCookie"] == null)
            {                                
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { {"controller", "MyController"}, {"action", "MyAction"}});                
            }
            else
            {
                base.OnActionExecuting(filterContext);
            }
        }

        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //The action filter logic - after
        }
    }

关于asp.net-mvc-3 - 如何开发特定的 Action 过滤 Controller 或 Action 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18981290/

相关文章:

asp.net-mvc-3 - MVC 3 ASP.NET 角色-授权属性

javascript cookie 算术计数

PHP $_COOKIE 仅在一个目录中可用

laravel - Laravel 存储用户 session 的位置

asp.net-mvc - 如果 session 在 mvc 中过期,则从 ActionFilter 显示弹出窗口

c# - .Net Core 3.1 中的自定义 ActionFilterAttribute 返回 : Unable to resolve service for type 'System.String'

asp.net-mvc-3 - 如何从匿名类值绑定(bind)下拉列表

asp.net-mvc-3 - 单击 actionLink 将打开新窗口

asp.net-mvc - 从 Mvc 3 View 填充 List<Objects>

asp.net-mvc - asp.net mvc 3 中的 AuthorizeAttribute 属性中使用 RedirectResult 的问题