POST

0

後如何訪問從不同的充局部視圖數據我有3個partialviews 3周的ViewModels頁:POST

  1. 帳戶列表
  2. 模式彈出(你可以在這裏修改多個賬戶)
  3. 搜索面板

我想刷新1.後在2上進行POST。這很簡單,但如果我想保留使用搜索麪板後得到的結果呢?

我可以用2種方法做到這一點,但兩者都不好(糾正我,如果我錯了)。

首先(我選擇和工作的一個)是在TempData中存儲3.中使用的viewmodel。我做搜索(POST)並保存TempData傳遞的視圖模型。然後,無論何時在不同的partialview上進行POST,我都可以刷新1.使用TempData中的數據(搜索參數)。

private const string SearchDataKey = "SearchData"; 
    [HttpGet] 
    public PartialViewResult RefreshData() 
    { 
     if (TempData[SearchDataKey] != null) 
      return PartialView("AccountListView", PrepareAccountListViewModelForSearchData(TempData[SearchDataKey] as AccountSearchViewModel)); 
     else 
      return PartialView("AccountListView", PrepareAccountListViewModel()); 
    } 

和保存視圖模型:

public PartialViewResult Search(AccountSearchViewModel searchParameters) 
    { 
    ... 
      TempData[SearchDataKey] = searchParameters; 
      return PartialView("AccountListView", databaseAccountListViewModel);} 

第二種方法是POST始終與所有3周的ViewModels 「大」 視圖模型。這樣我就可以從Search的視圖模型獲取數據,但是我會發送許多不需要的信息,而不是隻需要調用過程的Modal Popup的viewmodel。

我問過很少有MVC經驗的人,他們說他們從來不需要在TempData中存儲視圖模型,但它似乎比擁有1個Big表單並在每個POST中傳遞所有內容更合理。

你知道任何更好的方法來處理這個或哪一個是正確的嗎?

PS。話題有「最佳實踐」但被刪除了警告信息的原因。我希望詢問有關意見仍然被允許。

PS2。我的大多數POST &在初始加載後通過Ajax進行GET。

+0

詢問意見是無關緊要的。並聽取你更有經驗的同事(運行你的應用程序,並打F5刷新瀏覽器,以瞭解爲什麼你不應該使用'TempData' - 它只能持續一個請求) –

+0

@StephenMuecke,在這種特殊情況下,F5不是一個問題原因之後我寧願加載默認數據。另外,如果我選擇第二種方法並POST一切,那麼我相信在F5之後我仍然會丟失數據(因爲我將重定向到GET休耕後重定向 - 獲取模式)?因此,有一點改變問題,是否有任何錯誤,保持每頁1個表單,並在每個POST中傳遞1個大視圖模型(使用部分視圖的視圖模型) – Kostrzak

回答

0

我搜索(POST)

這似乎語義上不正確我。 搜索是一種不應修改服務器上任何狀態的操作。所以使用GET似乎更合適。而當您使用GET時,您可以獲得以下好處:所有參數都已存在於查詢字符串中,並因此在連續的POST操作(如修改您的案例中的帳戶)時保留。因此,您的RefreshData操作可能將AccountSearchViewModel作爲參數,模型聯編程序將負責其餘部分。

+0

這使得總體感覺,但問題是我使用AJAX並僅刷新使用JQuery的部分視圖,所以只有頁面的片段被刷新(因此我不能修改QueryString和搜索數據不被保留)。除了查詢字符串之外,保存搜索數據的唯一兩種方法是在每次POST中發送或保存在TempData中(兩種方法似乎都有問題)。 – Kostrzak