ASP.NET MVC、ActionFilters、静态类和数据传递
我想听听您对以下情况的意见和可能更好的建议: 我已经定义了一个定制的ActionFilter,它完成了一些工作,并产生了一些价值。我希望在控制器操作和模型中使用该值 现在,我可以使用TempData将这个值从ActionFilter传递给任何控制器操作方法,然后将这个值分发给传递给返回视图的所有模型 我相信它会起作用,但这个TempData会在没有人真正需要它的时候出现在会话中。该值应该在单个请求期间专门用于代码中,之后该值将有效地失效 我提出了两个选择: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
有没有其他/更好的选择我还没有考虑?我发现使用
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原则。谢谢你的提示。我不认为它否认了干燥原理。请记住,如果在控制器内的每个操作中都需要此属性,则可以将该属性应用于控制器类。谢谢。我害怕那样的事情。因此,这些静态字段在所有请求之间共享,而不是每个请求都有自己的上下文?对-应用程序中的每个线程都可以看到公共静态字段和属性。