2009-04-08 14 views
1

私は、例のフィルタリングが必要な場合のビューコントローラ通信のベストプラクティスを見つけようとしています。view to controller communication

私はページ上のアイテムとフィルタコントロールのコレクションを持っています。私は手紙、ステータスなどで項目をフィルタリングしています。 これは簡単なシナリオです。私はコントローラに選択された値をフィルタに送り、コントローラは結果をページに返します。

あなたがそれについて考えるなら、それは一方向サイクルです。コールコントローラをパラメータ(フィルタ値)で表示し、コントローラコールデータベースを使用して要素を取得し、その要素をビューバックに渡します。コントローラにこれらの要素とコントローラを送信してフィルタリングし、フィルタリングされたコレクションをビューに戻す方法はありますか?または、コントローラにIDの要素とコントローラを渡してフィルタリングする要素を知っているコントローラーに、フィルタリングされたコレクションを返すように、サーバーへのこの旅行を短縮することができます。

悪い練習ですか? いくつか回避できますか?

あなたはどう思いますか?私はこれを行っている方法

答えて

0

は、あなたがあなたの最後のparagで述べたもののようである

ありがとう:ちょうどそれらをフィルタリングするために、バックビュー

にフィルター処理されたコレクションを与え、これらの要素とコントローラをコントローラに

送信

これを行うにはlinqを使用できます。それであなたが何をリストに送るのかを考えてみましょう。したがって、フィルタを実行すると、カテゴリ別に言えば、フィルタリングされたカテゴリ別リストがあります(Category = "Book"としましょう)。

コントローラでは、List()アクション(またはそれを呼び出すもの)はフィルタパラメータを取る準備ができている必要があります。そのパラメータに基づいて、LINQを使用してビューに渡すコレクションを絞り込みます。このように:

public ActionResult List(bool fromCache, string filter) 
{ 
    // if filtering - always pull from cache to increase performance 
    ProductList productList; 
    if (fromCache) 
     productList = Session[SessionKeys.ProductList] as ProductList; 
    else 
    { 
     productList = ProductInfoList.GetProductInfoList(); 
     Session[SessionKeys.ProductInfoList] = productList; 
    } 

    // apply filter 
    var data = productList.Where(p => p.Category == filter); 
    return View(ViewLocations.ProductListing, data); 
} 

コードは構文上正しくないかもしれませんが、そこに行く - 幸運。

+0

これらの要素をセッションから取得する素晴らしいソリューションfromCache変数がfalseの場合、db.Iからそれらの要素を取り除きます。単にコントローラをフィルタにする必要があります。要素を送信して戻ってきます。それらはフィルタリングされ、tnx – Marko