我如何阻止MVC中的动作执行?

时间:2014-06-04 20:01:41

标签: asp.net-mvc

情况:

我有一个控制器(及其相关视图),在它被开发之后,决定将它从当前阶段排除,相反,它将被包含在将来的某个阶段。

我不能简单地从解决方案中排除或删除控制器和视图,因为我提到的将来会使用控制器。我想到的一件事就是强制控制器上的每个动作在被访问时重定向到主页面,但我认为这不是太“优雅”。

问题:

当通过URL访问控件时,我可以使用哪种方法来阻止控件中的操作执行?

5 个答案:

答案 0 :(得分:5)

在代码库中保留未使用的代码通常是一个坏主意。假设你有某种版本控制,请保留该控制器的分支,但是从主分支中删除它。当您重新启用此功能时,请将该分支合并。

但是,如果删除代码实际上是不可能的,我会制作一个自定义过滤器,将对该控制器的任何请求重定向到其他URL。

[RedirectTo("Index", "Home")]
public class MyFutureController : Controller {
...

你有

的地方
public class RedirectToFilter : ActionFilterAttribute {
   public string RedirectAction { get; set;}
   public string RedirectController { get; set; }

   public RedirectToFilter(string redirectAction, string redirectController) {
      RedirectAction = redirectAction;
      RedirectController = redirectController;
   }

   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
      filterContext.Result = RedirectToAction(RedirectAction, RedirectController);    
   }
}

FutureController的任何请求都会被重定向到您的Home/Index路由。将来,你只需要从控制器中删除该属性,你就可以了。

答案 1 :(得分:1)

您可以添加自定义路由,以便在请求到达此控制器时,它实际上会重定向到其他控制器,例如HomeController的

答案 2 :(得分:1)

在控制器上使用OnActionExecuting操作过滤器。

public class FooController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Detail()
    {
        return View();
    }

    protected override void OnActionExecuting( ActionExecutingContext filterContext )
    {
        filterContext.Result = RedirectToAction( "Index", "Home" );
    }

当您准备好开始使用控制器时,只需删除OnActionExecuting方法即可完成设置。

答案 3 :(得分:1)

只需使用[NonAction]属性修饰操作方法即可。更多Here

答案 4 :(得分:0)

您可以简单地编写一个视图,以便向在那里指示它仍处于构建中的用户或类似的东西显示给用户。排除或注释掉控制器肯定是一个选项,或者您可以重写所有相关方法以重新路由到另一个页面。

我认为最好的解决方案可能就是完全排除它,如果你当前没有使用它,那么在你的应用程序中使用它对你或用户没有好处。代码应该保留,以便您在实际获得发布版本之前可以自由地调整和优化它。