【问题标题】:Modify a model in an ActionFilter在 ActionFilter 中修改模型
【发布时间】:2010-01-12 04:31:20
【问题描述】:

我有一个动作过滤器,我在 ASP.NET MVC 2 中运行 OnActionExecuting。本质上,我希望动作过滤器清理我的数据并替换当前模型(将传递给后续动作过滤器以及我的动作方法)净化后的模型。这可能吗?这是一个坏主意吗?如果是,为什么?

提前谢谢你, JP

【问题讨论】:

  • Filip,如果您要批评,请保持建设性。告诉我为什么它是糟糕的设计,告诉我你认为什么是好的选择......否则你的评论对我和其他阅读这篇文章的人来说毫无用处......

标签: asp.net-mvc action-filter


【解决方案1】:

如果您需要处理您的模型,您可能会在单个控制器的范围内处理更多内容(除非您的所有控制器都使用相同的模型类型?)。另一种方法是覆盖控制器本身的OnActionExecuting()OnActionExecuted() 方法。这使您可以将业务逻辑保持在控制器范围内。

通常 ActionFilters 用于横切关注点 - 您希望为许多操作方法运行的东西,无论它们存在于应用程序中的什么位置。因此,除非您的模型清理逻辑适用于许多控制器和操作,或者非常通用(可能是这样,在这种情况下您的方法可能很好),您可能希望将其从过滤器中取出并放入您的控制器中。如果它是可以广泛应用的东西,那么一个 ActionFilter 就可以了。

【讨论】:

  • 我绝对明白你的意思,但清理工作在很大程度上是 CCC,将在控制器和操作方法中使用。
【解决方案2】:

这里是MVC v1,我希望v2不会改变:

var view = filterContext.Result as ViewResultBase;
if (view != null)
   view.ViewData.Model ...

我不明白您为什么要在 OnActionExecuting 中执行此操作,但如果您必须,请在此处执行,并设置 OnActionExecuted 必须调整生成的模型的一些标志(私有字段)。但是无论如何您都必须使用后者,除非您分配 .Result - 在这种情况下,您的操作根本不会被调用,并且将使用分配的结果。

【讨论】:

  • 我正在尝试访问模型 OnActionExecuting(即在操作执行之前),因此在这种情况下,模型将始终返回 null ....
  • 我应该更明确一点 - 我想(必须)这样做 OnActionExecuting 的原因是我仍然可以触发 ValidateInput 过滤器(并且不必关闭它!!!) .如果我的属性此时包含 HTML,它们将被标记为危险并且过滤器将失败(因为需要更好的术语)。在点击第二个过滤器之前需要更新数据,因此 OnActionExecuted 为时已晚...
【解决方案3】:

顺便说一句,对于 MVC 3 和 4:

filterContext.Controller.ViewData.Model

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 2017-06-28
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多