2

これは簡単なことですが、ViewStateがないと、ここではわかりません(WebFormsに長い間悩まされてきました、知っています!)。

私のシナリオ:

意見

 @foreach (var product in Model.Products)
{
    <tr>
       <td>@Html.ActionLink("Compare", "Compare", new { id = product.ProductId })</td>
    </tr>
}

コントローラ

public ActionResult Compare(int id = 0)
{
        var product = SelectProduct(id); // selects the product from a list of cached products.

        if (product != null)
        {
           // _productDetails is a Model specifically for my View.
            _productDetails.ComparedProducts.Add(product);
        }

        return View("Index", _productDetails);
}

明らかに、各アイテムの「比較」をクリックすると、比較対象製品リストに追加されます。ただし、ViewStateがないため、これはページが更新されるたびにクリアされ、最後の製品が失われます。このComparedProductsリストに製品を保持したいのですが、どうすればよいですか?

クエリ文字列に追加する必要があると思いますので、/ Carousel / Compare /?id = 2122,1221,1331,1333など。そうであれば、これはどのように可能ですか?

前もって感謝します。

更新しました

クエリ文字列ルートに移動したい場合、これを行うにはどうすればよいですか?

私はもう試した:

<td>@Html.ActionLink("Compare", "Compare", new { id = product.ProductId, compared = Model.ComparedProducts.Select(a => a.ProductId) })</td>

しかし、それは次のことをもたらします。

compared=System.Linq.Enumerable%2BWhereSelectListIterator`2[Product%2CSystem.Int32]

本当に期待します。さらにViewModelプロパティを作成し、そこに比較IDを格納するだけで、ビュー内に多くのビジネスロジックがないようにすると思いますか?

4

1 に答える 1

1

Webフォームとの関係に+1 :) これからは、セッション状態のようなWebフォームからすでに知っている他の方法で状態を維持し始めることができると思います: http://msdn.microsoft.com/en-us/library/ ms178581(v=vs.100).aspx

結局のところ、物事をシンプルに保ちたい場合は、最も単純なメソッドを使用することをお勧めします。たとえば、次のようになります。

<url>?reference=123&compare=456

最初のアクションは HttpGet として必要であり、これは httpPOST として必要です

[HttpPost]
public ActionResult Compare(myModel model)
{

    var product = SelectProduct(model.reference); // selects the product from a list of cached products.

    if (product != null)
    {
       // _productDetails is a Model specifically for my View.
       // you can always update the model you got in the first place and send it back
        model.ComparedProducts.Add(product); //
    }
return View("Index", model);

あなたのビューは、表示する空のプロパティに従って反応する必要があります

于 2012-11-23T11:34:25.033 に答える