【问题标题】:How do I know which action will execute using an ActionExecutingContext object?我如何知道将使用 ActionExecutingContext 对象执行哪个操作?
【发布时间】:2010-07-08 12:12:59
【问题描述】:

我有一个在所有操作方法执行之前执行的操作过滤器。

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
  //code omitted 
  UpdateModel(MyModel);
}

我希望此操作在应该执行操作 A、B、C 而不是 D 时更新模型。当 D 将执行时,如何防止此过滤器操作更新模型?那么使用上面的ActionExecutingContent filterContext可以知道吗?

谢谢

【问题讨论】:

    标签: asp.net-mvc filter


    【解决方案1】:

    您可以通过使用属性而不是 D 来装饰动作 A、B 和 C 来做到这一点。

    您已经收到了答案,但按照您的意图这样做是非常糟糕的做法。如果其他人在另一个控制器中编写了一个操作方法,该属性应该运行,然后偶然选择了一个您已过滤掉的名称。该属性不会运行 - 一个明显的错误 - 但它会完全按照它的指示运行。这将是一场维护噩梦。

    不,这样做的干净方法是将属性的应用程序从控制器级别移动到所有控制器的操作方法级别,其中存在不应该具有此属性的操作方法。只需查看控制器代码,就可以很容易地看到该属性何时运行,何时不运行。它会按预期工作。

    【讨论】:

    • @Richard,您正在编写的属性,其中包含您问题中的方法。以任何其他方式这样做都是非常糟糕的做法,请参阅我的更新。
    • 感谢您的两个回答。你们是对的。事实上,我正在尝试躲避另一个问题。无论如何,我解决了一个问题,但我介绍了许多其他问题。例如,每次我跳过更新模型时,我都会丢失数据等。所以,再次感谢您的回答(...)
    【解决方案2】:
    filterContext.ActionDescriptor.ActionName
    

    【讨论】:

    • 虽然这回答了 OP:s 的问题,但根据应用的操作名称来限制属性的使用确实是不好的做法。如果其他人将来查看此代码,并希望(并期望)动作过滤器在 所有 动作上运行怎么办?
    • 感谢您的两个回答。(请参阅我写给 Tomas Lycken 的 cmets)
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2018-06-01
    • 2016-01-12
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多