ASP.NET MVC控制器中的单例字典?

时间:2011-07-11 23:32:14

标签: asp.net-mvc

我在ASP.NET MVC应用程序中有一个控制器。该页面上有几个过滤器,它们由一个Dictionary对象在控制器中表示。过滤器字典如下所示:

 Dictionary<string,bool> filterMap = new Dictionary<string,bool>();
 filterMap.Add("Accepted",true);
 filterMap.Add("Rejected",true);
 filterMap.Add("Valid",true);
 filterMap.Add("Invalid",true);

在页面上,有切换按钮来设置尊重字典项的值(即如果关闭“已接受”按钮,它会将字典项上的值更改为false。

我遇到的问题是,每次调用页面时,字典都会在构造函数中重置,并初始化为上述值。

我的构造函数中有以下内容,但它没有帮助,因为字典被重置并且每次都为null。

public MyController(){
      if (FilterMap == null)
      {
            FilterMap = new Dictionary<string, bool> {{"Accepted", true}, {"Returned",true}, {"Valid", true},{"Invalid",true}};
       }
}

1 个答案:

答案 0 :(得分:1)

最简单的选择是在会话中保存FilterMap

private Dictionary<string, bool> FilterMap
{
    get { return (Dictionary<string,bool>)Session["FilterMap"] ?? GetDefaultFilterMap(); }
    set { Session["FilterMap"] = value; }
}

private static Dictionary<string, bool> GetDefaultFilterMap()
{
    return new Dictionary<string, bool> {{"Accepted", true}, {"Returned",true}, {"Valid", true},{"Invalid",true}};
}

然后在切换过滤器的操作中,请确保再次设置FilterMap以将更改保存在Session中(如果使用内存中会话状态则不需要):

public ActionResult ShowReturned(bool show)
{
    var filterMap = FilterMap;
    filterMap["Returned"] = show;
    FilterMap = filterMap;
}

请注意,如果您的词典只包含这些键,您也可以使用包含AcceptedReturned等的真实类作为属性。