1

Razor 構文を使用してオブジェクトのグループを反復処理することについて混乱しています。

コントローラーで、次のように設定します。

            ViewBag.accounts = accounts;
            Session["accounts"] = accounts;

そしてcshtmlページで、アカウントを繰り返し処理したいと思います:

@foreach (var account in ViewBag.accounts)

それはうまく機能しますが、同じ構文はセッションでは機能しません:

@foreach (var account in Session.accounts)

または

@foreach (var account in Session["accounts"])

セッションでコレクションを反復するにはどうすればよいですか?

4

3 に答える 3

4

Session動的ではありません。
代わりに、そのインデクサーは を返しますobject

IEnumerable<T>foreach ループで使用するには、値を次のように明示的にキャストする必要があります。

@foreach (var account in (IEnumerable<SomeType>)Session["accounts"])
于 2013-02-27T18:33:40.400 に答える
3

これはあなたの質問に対する直接的な回答ではありませんが、少しでもお役に立てれば幸いです。

dwerner が言ったように、これはView ではなくViewModel の仕事です。

View は、実行中の環境を可能な限り無視する必要があります。理想的には、(1) (宣言によって) 強くバインドされた ViewModel@model( 2) HTML ヘルパー関数を認識する必要があります。アプリに入っています(基本的に、これらは拡張メソッド offですHtmlHelper<Tmodel>

あなたのViewModelには、List<Account>あなたが何であれ満たすa が含まれている必要がViewBag.accountsあり、Viewbagを完全に無視することができます。ビューでは、コレクションは適切なタイプ (「アカウント」) から外れているため、からキャストしたり処理したりforeachせずに、ループ内でアカウント オブジェクトを直接操作できます。ObjectDynamics

「ダム」ビューと「スキニー」コントローラーを使用すると、ロジックの大部分が ViewModel に保持され、よりクリーンで維持しやすくなります。

于 2013-02-27T20:34:11.853 に答える
2

ViewData の使用

ViewData は、文字列をキーとして使用してアクセスできるオブジェクトのディクショナリです。これは、次のようなコードを書くことを意味します。

コントローラーで

public ActionResult Index()
{

var softwareDevelopers = new List<string>
{
    "Brendan Enrick", 
    "Kevin Kuebler", 
    "Todd Ropog"
};

ViewData["softwareDevelopers"] = softwareDevelopers;

return View();

}

ビューで

<ul>
@foreach (var developer in (List<string>)ViewData["softwareDevelopers"])
{
<li>
    @developer
</li>
 }
</ul>
于 2013-02-27T18:42:57.023 に答える