2011-05-02 59 views
1

我正在寻找解决以下问题的最佳方法:我有一个搜索页面,可以选择不同的标准,可在SearchViewModel中使用。现在搜索返回一个SearchResults列表,它是产品。那些可以直接加入篮子。 现在的问题是,将项目添加到购物篮的操作是在BasketController上,而不是SearchController。当用户点击它时,他会返回到SearchPage,但会失去他所做的所有选择。MVC 3在不同的控制器上执行操作,但需要ViewModel

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) 

我也认为可能有办法做到这一点使用的局部视图? 当然,我最后的ressource只是重复的代码,但我没有这个想法激动不已......

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


编辑 的呼吁控制器使用如下形式:

@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

不确定你的问题到底是什么......你为什么不能直接在你的视图上设置表单来将所有选中的产品直接发布到'BasketController'? – rsenna 2011-05-02 13:06:14

+0

它有一个“添加到购物篮”-Button,它通过购物篮控制器将产品添加到购物篮中,但用户必须在搜索页上使用搜索查看模型。我希望这可以让它更清晰一些...... – Nischo 2011-05-02 13:13:27

回答

1

我认为重定向是什么吹起TempData,尝试用“视图”替换控制器代码中的“重定向”,并将其传递给视图名称(而不是整个网址)。 (注意:如果你的控制器动作做了任何事情来填充一个视图模型,你需要复制该代码并在你调用视图之前插入它(我将它拉出到一个私有方法中,然后调用它这两个地方))

+0

TempData与重定向工作正常,我决定现在就这样做,然后将SearchModel的所有值写回去,即使我不喜欢它,我还没有找到另一种方法... – Nischo 2011-05-05 11:50:00

1

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

另外,当我实现搜索参数时,我经常在查询字符串上传递这些参数。他们仍然填充SearchViewModel,但在查询字符串中使用它们可以在必要时很容易地在Web请求之间传递它们。

+0

问题是,该网站必须使用禁用的JavaScript,这就是为什么我尝试避免使用AJAX。在搜索中还有一个包含约20个类别和其他附加值的列表,如果不需要,我不想将它们保存到查询字符串中。 – Nischo 2011-05-02 13:11:13

+0

当你只需要添加一个项目时,QueryString的效果很好,但是如何发布文本框的内容(要订购的项目的数量)?轻松使用AJAX,但禁用JavaScript? – slfan 2011-05-19 05:16:26

+0

您可以将表单的方法属性设置为“get”以在查询字符串中包含所有表单字段。 – 2011-05-19 12:40:32

0

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

  1. 商店所有购物篮项目到会话(明显)。
  2. 当呈现搜索结果页面时,对于每个项目来验证它是否已经进入篮子。如果是,显示它已检查。
  3. 当用户点击“添加到购物篮”,清除你购物篮并使用这最后一篇文章重新填充它。

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