mvc控制器默认动作

时间:2013-09-10 11:31:34

标签: asp.net-mvc asp.net-mvc-4 controller

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

示例:

我有一个checkoutcontroller,如果在网站上禁用电子商务,我希望每个操作都返回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();
        }
    }
}

2 个答案:

答案 0 :(得分: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

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

您可以找到更多info here.

答案 1 :(得分:0)

您可以创建custom action filter。这将拦截到该操作的路由,应用其内部逻辑,并继续执行操作或在过滤器中定义中断它。过滤器可以应用于individual actions, an entire controller class, or even globally for the whole application