2

我想要一些关于解决我遇到的问题的正确设计模式或方法的建议。

基本上,在 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);
}
4

1 回答 1

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;
}
于 2013-03-08T01:20:00.683 回答