2011-05-02 47 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. 當用戶點擊「添加到購物籃」,清除你購物籃並使用這最後一篇文章重新填充它。

當然,我不確定您是否正在使用分頁。如果你是,這個解決方案可能不會工作...

相關問題