设计模式以保持过滤器选择

时间:2013-03-07 22:49:15

标签: c# asp.net-mvc design-patterns session-variables

我想就适当的设计模式或方法提出一些建议,以解决我遇到的问题。

基本上,在MVC3中,我有一个控制器,它有多个动作,只需生成表数据。大多数(但不是全部)操作应具有可选的年份值,该值根据选定的年份过滤结果。目前,我通过查询字符串接受年份值,但如果未提供(或无效),则默认为当前年份。

我正在考虑创建简单的操作方法,允许用户通过选择列表更改年份,将选定的值(和当前页面)发布到将所选年份设置为会话变量的操作(验证后)并将用户重定向回他们所在的页面。然后对于所有后续请求,在控制器构造函数中,我将从会话变量读回年份并存储在本地变量中,然后可以在每个操作中使用该变量。

但是,我对采用这种方法犹豫不决,因为有许多引用(在本网站上有许多引用)警告在控制器构造函数中使用会话变量。我可以继续将年份作为每个方法中的查询字符串参数传递,但以下是来自一个操作的代码片段,其中显示了我今年如何验证并在每个操作中重复此操作似乎违反了DRY原则。有关如何实现这一目标的任何建议吗?

public ActionResult FundsAppropriationList(int? year = null)
{
  var fundsAppropriationListModel = new FundsAppropriationListModel(); 
  if (year != null && year >= 2000 && year <= 2099)
  {
    fundsAppropriationListModel.SelectedYear = (int)year;
  }
  else
  {
    fundsAppropriationListModel.SelectedYear = DateTime.Now.Year;
  }
  fundsAppropriationListModel.AvailableYearsList = new SelectList(_grantReviewServices.GetYearsForWhichReviewsExist().Select(x => new {value = x, text = x}), "value", "text");
  //... Remainder of model population here...
  return PartialView("_FundsAppropriationList", fundsAppropriationListModel);
}

1 个答案:

答案 0 :(得分:2)

为什么你必须在每个动作中复制该代码?难道你不能将重复的代码封装到自己的方法中吗?像这样:

public ActionResult FundsAppropriationList(int? year = null)
{
  var fundsAppropriationListModel = new FundsAppropriationListModel(); 

  fundsAppropriationListModel.SelectedYear = AssignYear(year);

  fundsAppropriationListModel.AvailableYearsList = new SelectList(_grantReviewServices.GetYearsForWhichReviewsExist().Select(x => new {value = x, text = x}), "value", "text");
  //... Remainder of model population here...
  return PartialView("_FundsAppropriationList", fundsAppropriationListModel);
}

“重复”代码:

internal static int AssignYear(int? year = null)
{
  if (year != null && year >= 2000 && year <= 2099)
  {
    return (int)year;
  }

  return DateTime.Now.Year;
}