1

我正在寻找解决以下问题的最佳方法:我有一个搜索页面,可以选择不同的标准,这些标准在 SearchViewModel 中可用。现在搜索返回一个 SearchResults 列表,它们是产品。这些可以直接添加到篮子中。现在的问题是,将商品添加到购物篮的操作是在 BasketController 而不是 SearchController 上。当用户单击它时,他会返回到 SearchPage,但会丢失他所做的所有选择。

if (Request.UrlReferrer != null)
        return Redirect(Request.UrlReferrer.ToString());

我曾尝试使用 TempData 解决此问题,但我收到“查询的结果不能多​​次枚举。”-异常。

private SearchViewModel EnsureViewModel(SearchViewModel viewModel)
    {
        if (TempData["SearchModel"] != null && viewModel.SearchResult == null)
            viewModel = TempData["SearchModel"] as SearchViewModel;

        TempData["SearchModel"] = viewModel;
        return viewModel;
    }

在这里,我在模型中显示我的结果列表,抛出异常:

@Html.DisplayFor(p => Model.SearchResult)

我还考虑过可能有一种方法可以使用局部视图来做到这一点?当然,我最后的资源只是复制代码,但我对这个想法并不感到兴奋......

任何想法表示赞赏,谢谢=)


编辑控制器的调用是使用如下形式进行的:

@using (Html.BeginForm("Add", "Basket", new { id = Model.Name } ))
    {
        @Html.TextBox("amount", "1", new { name="amount", maxlength=7, @class = "txtfield number" })
        <button><img src="@Url.Content("~/Content/images/icon_basket.gif")" border="0" width="14" height="10" class="basket" /></button>
    }       
4

3 回答 3

1

为什么不使用 AJAX 调用“添加到篮子”方法?然后用户无需离开您的搜索页面即可将项目添加到购物篮,这将保留他们的搜索。

此外,当我实现搜索参数时,我经常在查询字符串中传递这些参数。它们仍然填充 SearchViewModel,但将它们放在查询字符串中可以让它们在必要时在 Web 请求之间轻松传递。

于 2011-05-02T13:08:25.360 回答
1

我认为重定向是炸毁 TempData 的原因,尝试用“View”替换控制器代码中的“Redirect”并将视图名称(而不是整个 url)传递给它。

(注意:如果您的控制器操作正在执行任何操作来填充视图模型,则您需要复制该代码并将其插入到调用视图之前(我将其拉出到私有方法中并从两个地方调用它))

于 2011-05-02T17:29:00.660 回答
0

如果不能使用 AJAX,还有另一种选择:

  1. 将所有篮子项目存储到会话中(显然)。
  2. 在呈现搜索结果页面时,为每个项目验证它是否已经在购物篮中。如果是,请显示它已选中。
  3. 当用户单击“添加到购物篮”时,请清除您的购物篮并使用最后一篇文章重新填充它。

当然,我不确定您是否使用分页。如果你是,这个解决方案可能不起作用......

于 2011-05-02T13:22:12.000 回答