2013-03-07 31 views
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); 
} 

回答

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; 
} 
+0

是啊,这就是我终于实现了。它只是轻微的“嗅觉”,我不得不在每个动作中调用相同的方法。我只是认为可能有更好的方法来告诉控制器“每个动作都需要配置这些数据,所以当控制器被实例化时,为我做这些”。无论如何,感谢您的反馈。 – bigmac 2013-03-08 17:31:16