我有一个有几个动作的控制器。如果服务上的IsCat字段为 false ,则应重定向 Action :
所以是这样的:
public ActionResult MyCatAction()
{
if (MyService.IsCat==false)
return RedirectToAnotherControllerAction();
...
这可以在一个属性中完成并应用于整个控制器的一组动作吗?
我有一个有几个动作的控制器。如果服务上的IsCat字段为 false ,则应重定向 Action :
所以是这样的:
public ActionResult MyCatAction()
{
if (MyService.IsCat==false)
return RedirectToAnotherControllerAction();
...
这可以在一个属性中完成并应用于整个控制器的一组动作吗?
在这种情况下,动作过滤器是要走的路:
动作过滤器,它包装了动作方法的执行。此过滤器可以执行额外的处理,例如向操作方法提供额外的数据、检查返回值或取消操作方法的执行。
这是一个很好的 MSDN 方法:如何:创建自定义操作过滤器
在你的情况下,你会有这样的事情:
public class RedirectFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (MyService.IsCat==false)
return RedirectToAnotherControllerAction();
}
}
然后,您将在控制器级别应用此过滤器(应用于所有控制器操作)
[RedirectFilterAttribute]
public class MyController : Controller
{
// Will apply the filter to all actions inside this controller.
public ActionResult MyCatAction()
{
}
}
或每个动作:
[RedirectFilterAttribute]
public ActionResult MyCatAction()
{
// Action logic
...
}
这样做应该很简单,并且 MS 文档有一个非常好的演练:
http://msdn.microsoft.com/en-us/library/dd381609(v=vs.100).aspx
是的。您可以使用操作过滤器并修改结果。这是一个简单的属性,它将执行类似的操作:
public class RedirectOnCat : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if(MyService.IsCat == false)
filterContext.Result = new RedirectResult(/* whatever you need here */);
}
}
您也可以OnActionExecuted
以非常相似的方式覆盖控制器。