2016-02-02 181 views
-1

我在一個Web項目中工作,首先從數據庫獲取數據並綁定到Html控件。如果出現驗證錯誤,我將發送相同的視圖以顯示驗證錯誤。當頁面出現時,有一個例外。我瀏覽了代碼,發現模型已通過將收集空值。基本上任何不綁定到文本框的屬性都被更改爲null。我被告知不要使用session或viewdata來保存臨時存儲。因此,我調用一個方法SaveViewState它的視圖模型屬性的所有屬性值保存到一個靜態變量,像這樣asp.net mvc ViewState實現

private static MyViewModel _viewModel; 

private MyViewModel SaveViewModel(MyViewModel viewModel) 
     { 
      if (_viewModel == null) 
      { 
       _viewModel = new MyViewModel(); 
      } 

      if (!string.IsNullOrEmpty(viewModel.MyName)) 
       _viewModel.MyName= viewModel.MyName; 
      if (!string.IsNullOrEmpty(viewModel.Number)) 
       _viewModel.Number= viewModel.Number; 
      if (!string.IsNullOrEmpty(viewModel.Address)) 
       _viewModel.Address= viewModel.Address; 
      if (!string.IsNullOrEmpty(viewModel.State)) 
       _viewModel.State= viewModel.State; 
      } 

它的工作原理,但我認爲這是非常低效的,並且必須有實現的ViewState以更好的方式MVC與會議或ViewData或HiddenFields?順便說一下,我被告知不要使用這三個。

任何幫助表示讚賞。謝謝。

+0

顯示您如何使用集合。如果您發佈以模型作爲參數的操作,它應該被填充。 –

+0

爲什麼MVC開發的原因之一是擺脫'ViewState'。你的實現不會工作,因爲它不是線程安全的(如果多於一個用戶正在編輯'MyViewModel'的實例,它將全部失敗)。如果您不創建控件來回發所有數據並需要返回視圖,請再次調用存儲庫以獲取原始對象,並使用缺少的值再次填充視圖模型。 –

回答

1

我不確定此解決方案是否比使用會話或隱藏字段更差。在您的操作中,您應該使用與發佈的相同型號返回相應的視圖。該ActionResult的應該是這樣的:

public ActionResult SomePost(SomeModel model) 
{ 
    if (!ModelState.IsValid()) 
    { 
     //error in validation 
     return View(model); 
    } 

    //post save redirect and stuff 
    return ... redirect? 
} 

ModelState.IsValid()將根據DataAnnotations測試。像[Required][MaxLength]等標準屬性是可用的。

在此配置中,不需要使用SaveViewModel函數。如果您的收藏在發佈後爲null:重新查詢它,請將其發佈或從類似ViewData的對象中獲取。

有充分的理由不使用你所提到的這三個,但如果你知道這個原因,你可能要考慮它:

1)會議的使用:將可擴展性困難,因爲在會話的每個請求必須擊中該特定服務器。

2)隱藏字段:不是真正的問題IFF你意識到隱藏字段可以在瀏覽器中操作。所以不要存儲ID的存在

3)ViewData:基本上打破了MVC模式;你可以用它來存儲數據,但這就是模型的用途。從過濾器使用ViewData完全合法。例如提供一些通用功能。