6

我有一个有几个动作的控制器。如果服务上的IsCat字段为 false ,则应重定向 Action :

所以是这样的:

    public ActionResult MyCatAction()
    {
        if (MyService.IsCat==false)
            return RedirectToAnotherControllerAction();
     ...

这可以在一个属性中完成并应用于整个控制器的一组动作吗?

4

4 回答 4

5

在这种情况下,动作过滤器是要走的路:

动作过滤器,它包装了动作方法的执行。此过滤器可以执行额外的处理,例如向操作方法提供额外的数据、检查返回值或取消操作方法的执行。

这是一个很好的 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
     ...
}    
于 2013-03-28T16:09:30.520 回答
2

是的。

了解动作过滤器

动作过滤器是一个属性。您可以将大多数操作过滤器应用于单个控制器操作或整个控制器

(而且您也可以使其对整个应用程序具有全局性)。

于 2013-03-28T16:08:00.350 回答
1

这样做应该很简单,并且 MS 文档有一个非常好的演练:

http://msdn.microsoft.com/en-us/library/dd381609(v=vs.100).aspx

于 2013-03-28T16:06:50.243 回答
1

是的。您可以使用操作过滤器并修改结果。这是一个简单的属性,它将执行类似的操作:

public class RedirectOnCat : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if(MyService.IsCat == false)
            filterContext.Result = new RedirectResult(/* whatever you need here */);
    }
}

您也可以OnActionExecuted以非常相似的方式覆盖控制器。

于 2013-03-28T16:11:18.843 回答