2013-07-17 43 views
0

感謝幫助我走出大家的努力,基本上我在控制器面臨的一個問題下面,只是使它簡單和容易:.NET MVC:AQ在控制器改變值時

Controller C{ 

     public list<model> a; 
     //used in action A, if it's a searched list, then don't initialize; 
     public bool searched = false; 


     public ActionResult A(){ 
      if(searched){ 
      ViewBag.a = a; 
      }else 
      //initial the list 
      a = db.model.where(); 
      ..... 
      return view() 
     } 

     //return a result list when people search by keywords 
     public ActionResult B(string str){ 
      a = db.model.where(d=> d.id = str); 
      search = true; 
     } 

    } 

但是,它事實證明,在B之後,a和research兩者的值從未改變過。

我錯過了.NET MVC中的一些關鍵知識嗎?

任何相關的文章都非常歡迎

感謝

+0

當'B'被調用時,你不會把它們放在'ViewBag'中。 –

回答

1

你可能在想,國家將兩個Web請求之間保存。但是,當Web請求結束時,整個控制器將被銷燬,並且設置的信息將丟失,除非它存儲在持久數據存儲庫(如Session或數據庫)中。

如果我正確理解你的代碼,如果你稍微重構你的代碼,你可以在一個動作下實現你的搜索功能,而且你不需要持久地存儲數據。

+0

如果是這樣,我認爲它不時佔用資源和時間,我應該如何保持會話中的數據,像Session [「list」]一樣? (對不起,這是我在MVC上的第一週,並且仍然在學習) – user1804033

+0

如果需要,可以嘗試使用Session,但這不是處理像這樣的列表的最佳實踐,因爲對象需要可序列化以存儲在Session中,並且它如果得到許多用戶的許多結果,可以吃掉記憶。更不用說終端用戶會話重置失敗的結果。我會嘗試重構代碼,因此您不需要任何持久存儲來執行過濾/搜索。 –

+0

你提出了一個非常好的觀點,這不是一件幾乎沒有發生的事情,它每天都會發生,在我的數據分頁網站中,一旦人們通過關鍵字進行搜索,他們得到了一個不同的過濾列表,然後如果他們點擊第二頁按鈕, ,只有沒有被過濾的原始列表 – user1804033

1

Controller C在每次請求重新建立,因此即使值B被調用後更新,爲A下一個請求將需要控制器C創建一個這樣的搜索將被重新實例。

您可能希望使局部變量爲靜態。

+0

試過了靜態,原來沒有工作,還有其他什麼好建議? – user1804033

+0

靜態不會將它們添加到視圖包中。這必須在B內完成。 – Amy