假设我有一个具有多个操作的控制器,是否有覆盖以使控制器在满足条件时返回默认操作?
示例:
我有一个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();
}
}
}
答案 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。