ASP.NET MVC、ActionFilters、静态类和数据传递

ASP.NET MVC、ActionFilters、静态类和数据传递,.net,asp.net-mvc,architecture,action-filter,static-classes,.net,Asp.net Mvc,Architecture,Action Filter,Static Classes,我想听听您对以下情况的意见和可能更好的建议: 我已经定义了一个定制的ActionFilter,它完成了一些工作,并产生了一些价值。我希望在控制器操作和模型中使用该值 现在,我可以使用TempData将这个值从ActionFilter传递给任何控制器操作方法,然后将这个值分发给传递给返回视图的所有模型 我相信它会起作用,但这个TempData会在没有人真正需要它的时候出现在会话中。该值应该在单个请求期间专门用于代码中,之后该值将有效地失效 我提出了两个选择: 在ActionFilter中,我在On

我想听听您对以下情况的意见和可能更好的建议:

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

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

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

我提出了两个选择:

  • 在ActionFilter中,我在OnActionExecuting()中的TempData中设置此值,并在OnActionExecuted()中删除它。在调用OnActionExecuted时,控制器操作已经完成,响应已经生成,并且该TempData内容还没有到达会话,我是否正确地理解了这一点

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


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

    我发现使用
    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
    }
    
    回复:#2

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


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

    其实很有趣。是这样的,动作构造函数参数会自动映射到动作参数集合键吗?是的,动作参数应该是在控制器中传递值的首选方式。最终我喜欢这种方法,尽管它肯定否定了DRY原则。谢谢你的提示。我不认为它否认了干燥原理。请记住,如果在控制器内的每个操作中都需要此属性,则可以将该属性应用于控制器类。谢谢。我害怕那样的事情。因此,这些静态字段在所有请求之间共享,而不是每个请求都有自己的上下文?对-应用程序中的每个线程都可以看到公共静态字段和属性。