2

私が抱えている問題を解決するための適切な設計パターンまたは方法に関する提案が欲しいです。

基本的に、MVC3 には、単純にテーブル データを生成する複数のアクションを持つコントローラーがあります。ほとんどの (すべてではない) アクションには、選択した年に基づいて結果をフィルター処理するオプションの年の値が必要です。現在、クエリ文字列を介して年の値を受け入れていますが、提供されていない (または無効な) 場合は、デフォルトで現在の年になります。

ユーザーが選択リストを介して年を変更し、選択した値(および現在のページ)をアクションに投稿して、選択した年をセッション変数に設定し(検証後)、リダイレクトする単純なアクションメソッドを作成することを考えていましたユーザーは元のページに戻ります。次に、後続のすべてのリクエストに対して、コントローラー コンストラクターでセッション変数から年を読み戻し、各アクションで使用できるローカル変数に格納します。

ただし、コントローラーコンストラクターでセッション変数を使用することについて警告する多くの参照 (このサイトには多く) があるため、このアプローチを採用することをためらっています。各メソッドで引き続きクエリ文字列パラメーターとして年を渡すことができますが、以下は 1 つのアクションからのコードの抜粋であり、今年を検証する方法を示しており、各アクションでこれを複製することは 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 に答える