0

假设我有一个具有多个操作的控制器,如果满足条件,是否有一个覆盖可以使控制器返回默认操作?

例子:

HttpNotFound()我有一个结帐控制器,如果网站上禁用了电子商务,我希望每个操作都返回,有没有比仅执行以下操作更好的方法:

public class CheckoutController
{
    [HttpGet]
    public ActionResult ViewBasket()
    {
        if (AppSettings.EcommerceEnabled)
        {
            return View();
        }
        else
        {
            return HttpNotFound();
        }
    }

    [HttpGet]
    public ActionResult DeliveryAddress()
    {
        if (AppSettings.EcommerceEnabled)
        {
            return View();
        }
        else
        {
            return HttpNotFound();
        }
    }
}
4

2 回答 2

2

您可以创建一个自定义操作过滤器,用于 CheckoutController 中的操作方法。

public class CommercePermissionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (AppSettings.EcommerceEnabled)
        {
            base.OnActionExecuting(filterContext);
        }
        else
        {
           // Example for redirection
           filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary 
                { 
                    { "Controller", "Error" }, 
                    { "Action", "AccessDenied" }
                });
        }  
    }
}

然后您可以通过以下方式在每个操作方法上使用此过滤器

[HttpGet]
[CommercePermission]
public ActionResult ViewBasket()

或者,如果您希望整个控制器操作都具有此过滤器,

[CommercePermission]
public class CheckoutController

您甚至可以将过滤器全局应用于项目中的所有操作。

你可以在这里找到更多信息。

于 2013-09-10T11:37:34.210 回答
0

您可以创建自定义操作过滤器。这将拦截到该操作的路由,应用其内部逻辑,然后继续执行该操作或按照您在过滤器中的定义中断它。过滤器可以应用于单个操作、整个控制器类,甚至可以全局应用于整个应用程序

于 2013-09-10T11:37:57.030 回答