.NET MVC 4 - 保持所选对象列表状态的最佳实践

时间:2012-11-23 11:23:10

标签: c# .net asp.net-mvc

这应该是一个简单的,但是如果没有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);
}

显然,当您点击每个项目的“比较”时,它会添加到ComparisonProducts列表中。但是,由于没有ViewState,这将在每次刷新页面时清除,并丢失最后一个产品。我希望产品保存在此ComparativeProducts列表中,但是如何?

我猜他们需要附加到查询字符串,所以/ 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存储在我的视图中没有太多业务逻辑?

1 个答案:

答案 0 :(得分:1)

+1表示你与webforms的关系:) 我想从现在开始,您可以开始以会话状态等网络形式的其他方式保持状态: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);

您的视图应根据显示的空属性做出反应