我正在寻找解决以下问题的最佳方法:我有一个搜索页面,可以选择不同的标准,这些标准在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>
}
答案 0 :(得分:1)
为什么不使用AJAX调用“添加到篮子”方法?然后,用户无需离开搜索页面即可将商品添加到购物篮中,这样可以保留搜索结果。
此外,当我实现搜索参数时,我经常在查询字符串上传递这些参数。它们仍然填充了SearchViewModel,但是如果有必要,可以在查询字符串上使用它们,这样就可以很容易地在Web请求之间传递它们。
答案 1 :(得分:1)
我认为重定向正在炸毁TempData,尝试用“View”替换控制器代码中的“Redirect”,并将视图名称(而不是整个URL)传递给它。
(注意:如果您的控制器操作正在执行任何操作以填充视图模型,则需要复制该代码并在调用View之前插入它(我将其拉出到私有方法中并从两者中调用它)地点))
答案 2 :(得分:0)
如果您不能使用AJAX,还有另一种选择:
当然,我不确定你是否使用分页。如果你是,这个解决方案可能无法正常工作......