【问题标题】:ASP.NET MVC, ActionFilters, static classes and passing data aroundASP.NET MVC、ActionFilters、静态类和传递数据
【发布时间】:2010-10-23 12:03:02
【问题描述】:

我想听听您的意见,也许对以下场景有更好的建议:

我已经定义了一个自定义的 ActionFilter,它可以完成一些工作并产生一些价值。我想在控制器操作和模型中使用该值。

现在,我可以使用 TempData 将该值从 ActionFilter 传递给任何控制器操作方法,然后将该值分配给传递给返回视图的所有模型。

我确信它会起作用,但这个 TempData 将在会话中出现,在没有人真正需要它的地方和时间。该值应该仅在单个请求期间在代码中使用,之后它会有效地失效。

我想出了两个选择:

  1. 在 ActionFilter 中,我在 OnActioExecuting() 的 TempData 中设置此值,并在 OnActionExecuted() 中将其删除。我是否正确理解,在调用 OnActionExecuted 时,控制器操作已完成,响应已生成且此 TempData 内容尚未进入会话?

  2. 在我的任何自定义静态类(逻辑)中,我只需为此值定义一个公共属性,并在需要时使用它。这个静态字段在 OnActionExecuting() 和实际执行控制器方法之间不会丢失吗?在服务器上的请求处理过程中可能会丢失此值是否还有其他问题?

我还没有考虑过其他/更好的选择吗?

【问题讨论】:

    标签: .net asp.net-mvc architecture action-filter static-classes


    【解决方案1】:

    我发现使用ActionParameters 可以使您的代码非常容易测试。你可以这样做:

    // inside your actionfilter
    public override void OnActionExecuting(ActionExecutinContext context)
    {
        var someData = // ... load some data
    
        context.ActionParameters["someData"] = someData;
    }
    
    
    // and then in your action method
    [ProvideSomeData]
    public ViewResult Index(SomeData someData)
    {
        // someData will be populated in here
    }
    

    【讨论】:

    • 其实很有趣。是不是这样action构造函数的参数会自动映射到ActionParameters集合键上?
    • 是的,动作参数应该是在控制器中传递值的首选方式。
    • 最终我喜欢这种方法,尽管它肯定否定了 DRY 原则。感谢您的提示。
    • 我不认为它否定了 DRY 原则。请记住,如果您在控制器内的每个操作中都需要这个,您可以将属性应用到控制器类。
    【解决方案2】:

    回复:#2

    只是想指出静态字段的问题是多个请求都将使用相同的静态字段。如果您有两个请求同时执行,则请求 B 总是有可能覆盖请求 A 的值,并且当请求 A 的操作执行时,您将使用错误的值。

    我会避免使用静态成员来保存请求的特定信息。

    【讨论】:

    • 谢谢。我害怕这样的事情。那么,这些静态字段在所有请求之间共享,而不是每个请求都有自己的上下文?
    • 正确 - 公共静态字段和属性对应用程序中的每个线程都是可见的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2011-02-15
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多