【问题标题】:MVC 3 Action on different controller, but need ViewModelMVC 3 Action 在不同的控制器上,但需要 ViewModel
【发布时间】:2011-05-02 12:54:57
【问题描述】:

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

【问题讨论】:

  • 不确定您的问题到底是什么...为什么您不能在视图上设置表单以将所有已检查的产品直接发布到BasketController
  • 它有一个“Add-To-Basket”-Button,通过购物篮控制器将产品添加到购物篮,但用户必须在搜索页面上用搜索视图模型说。我希望这让它更清楚一点......

标签: asp.net-mvc model controllers tempdata


【解决方案1】:

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

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

【讨论】:

  • TempData 在重定向下工作正常,我决定暂时这样做,并将 SearchModel 的所有值写回去,即使我不喜欢它,我也没有找到了另一种方式...
【解决方案2】:

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

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

【讨论】:

  • 问题是,该站点必须使用禁用的 javascript,这就是我尝试避免 AJAX 的原因。同样在搜索中有一个大约 20 个类别和其他附加值的列表,如果没有必要,我不想将它们保存到查询字符串中。
  • QueryString 很好用,当您只需要添加一个项目时,您将如何发布文本框的内容(要订购的项目数量)?使用 AJAX 很容易,但禁用了 JavaScript?
  • 您可以将表单的method属性设置为“get”以包含查询字符串中的所有表单字段。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多