MVC 3 Action对不同的控制器,但需要ViewModel

时间:2011-05-02 12:54:57

标签: asp.net-mvc model controllers tempdata

我正在寻找解决以下问题的最佳方法:我有一个搜索页面,可以选择不同的标准,这些标准在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>
    }       

3 个答案:

答案 0 :(得分:1)

为什么不使用AJAX调用“添加到篮子”方法?然后,用户无需离开搜索页面即可将商品添加到购物篮中,这样可以保留搜索结果。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

  1. 将所有篮子物品存放到会话中(显然)。
  2. 在呈现搜索结果页面时,为每个项目验证它是否已经进入购物篮。如果是,请显示已选中。
  3. 当用户点击“添加到购物篮”时,清除您将使用最后一篇文章进行购物并重新填充。
  4. 当然,我不确定你是否使用分页。如果你是,这个解决方案可能无法正常工作......