1

たとえば、フィルタリングが必要な場合に備えて、ビューコントローラー通信のベストプラクティスは何かを見つけようとしています。

ページ上のアイテムのコレクションとフィルター コントロールがあります。文字、ステータスなどでアイテムをフィルタリングしています...簡単なシナリオです。フィルターで選択した値をコントローラーに送信し、コントローラーは結果をページに返します。

考えてみれば、一方向のサイクルです。パラメーター(フィルター値)を使用してコントローラーを呼び出し、コントローラーがデータベースを呼び出してから要素をフェッチし、その要素をビューに戻します。これらの要素とコントローラーをコントローラーに送信して、それらをフィルター処理し、フィルター処理されたコレクションをビューに戻す方法はありますか? または、このサーバーへの移動を短縮し、コントローラーに要素の id のみを与え、コントローラーにデータベースからプルする要素を認識させ、それらをフィルター処理して、フィルター処理されたコレクションを返す...

悪い習慣?いくつかの回避策はありますか?

どう思いますか?

ありがとう

4

1 に答える 1

0

私がこれをどのように行ったかは、あなたが最後のパラグラフで述べたことのようなものです。

これらの要素とコントローラーをコントローラーに送信して、それらをフィルター処理し、フィルター処理されたコレクションをビューに戻します

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);
}

コードは構文的に正しくない可能性がありますが、幸運を祈ります。

于 2009-04-10T15:54:25.890 に答える