我想就适当的设计模式或方法提出一些建议,以解决我遇到的问题。
基本上,在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);
}
答案 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;
}