我想就正确的设计模式或方法来解决我遇到的问题提出一些建议。坚持过滤器选择的设计模式
基本上,在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);
}
是啊,这就是我终于实现了。它只是轻微的“嗅觉”,我不得不在每个动作中调用相同的方法。我只是认为可能有更好的方法来告诉控制器“每个动作都需要配置这些数据,所以当控制器被实例化时,为我做这些”。无论如何,感谢您的反馈。 – bigmac 2013-03-08 17:31:16