2013-03-07 2 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