如何开发特定的动作过滤器控制器或动作方法

时间:2013-09-24 12:12:17

标签: 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启用或禁用开发属性驱动检查。

我想以这样的方式开发代码,因为我不应该传递任何控制器名称或操作名称。我喜欢使用像

这样的代码
[HttpPost]
 [CheckCookieAttribute]
 public ActionResult Save(Person oPerson)
 {
        return View();
 }

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

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

我不会提供控制器或动作名称的任何名称。只需指导我在代码中需要更改的内容。感谢

1 个答案:

答案 0 :(得分:3)

您尝试完成的内容似乎已内置于ASP.NET MVC中。

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

如果要在未授权用户时将用户重定向到特定控制器/操作,则可以改为使用以下属性:

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
        }
    }