我正在尝试开发一个自定义操作过滤器,它会检查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();}
}
}
我不会提供控制器或动作名称的任何名称。只需指导我在代码中需要更改的内容。感谢
答案 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
}
}