2014-02-19 32 views
0

我有一個MVC 3應用程序了其中我通過vewmodel從控制器向視圖。該vewmodel包含一些列表<>屬性。MVC3剃刀傳遞到視圖模型電腦板列表<>爲空

 public ActionResult MainView() 
    { 
     var model = GetViewModel(); 
     return View("SignificantEventsView", model); 
    } 
private SignificantEventsViewModel GetViewModel() 
    { 
     var viewModel = new SignificantEventsViewModel(); 
     List<County_Codes> countyCodes = GetCountyCodeList(); 
     List<String> stateNames = countyCodes.OrderBy(o=>o.County_st).Select(o => o.County_st).Distinct().ToList(); 

     viewModel.selectedState = stateNames.FirstOrDefault(); 
     viewModel.CountyCodesList = countyCodes; 
     viewModel.StateNames = stateNames; 
     viewModel.SelectedCounties = new String[]{}; 
     viewModel.SelectedCountyCodes = new String[] { }; 
     viewModel.UnSelectedCounties = new String[] { }; 
     viewModel.UnSelectedCountyCodes = new String[]{}; 

     return viewModel; 
    } 

觀是這樣的:

@model ServicingPortal.ViewModels.SignificantEventsViewModel 
@{ 
     ViewBag.Title = "Significant Events"; 
} 

<h2>SignificantEvents</h2> 

@using (Html.BeginForm("RefreshCounties", "SignificantEvents", FormMethod.Post, new { id = "significantEventsForm", Model })) 
{ 
     <fieldset> 
      <span class="SpanTextboxEdit"> 
      @Html.Label("states", "States") 
      <br /> 
     <br /> 
      @Html.DropDownListFor(o => @Model.selectedState 
       , new SelectList(Model.StateNames) 
       , new { id = "stateDropDown", onchange = "submit()", name = "test" }) 
     </span> 
    </fieldset> 
     ... 
} 

當StateDropdownList改變時veiwmodel回傳給控制器,但countyCodes列表總是空。

我試圖在視圖中添加@ Html.HiddenFor(O => @ Model.CountyCodesList),但它仍然返回null。似乎不是null的唯一值是諸如String或String []之類的基本類型。即使列表stateNames爲空。

我不想重建縣代碼列表中的每個帖子後面,因爲沒有涉及實質性的開銷。我必須從數據庫中的所有活躍貸款創建清單,其中有數千個。

我怎樣才能得到一個列表<>從視圖控制器堅持?

我應該解釋什麼,我想在這裏acheive。

我有一個下拉列表和一個多選列表框。下拉列表包含狀態,列表框包含按選定狀態過濾的縣。
我需要在選定狀態更改時過濾列表框內容。
在客戶端執行這個任務是有意義的,但我還沒有找到一個好的解決方案。
我會承認我的JavaScript技能非常有限。 我以某種方式研究的所有解決方案涉及到在服務器端過濾縣列表。 我可以很容易地在服務器端實現這一點,但我認爲,因爲我已經建立了列表,爲什麼不保持它完整,而不是每次都去後端。

+0

出於好奇,嘗試在'GetCountryCodeList()'之後添加'.ToList()'。 – smdrager

+0

其實GetCountryCodeList()已經返回List user1337493

回答

0

簡單的答案是,你不能真正做你想做的事情。你有點想解決錯誤的問題。你應該考慮在服務器端使用緩存來防止每次都返回數據庫來構建縣列表。

+0

我也試過這條路線,但好像整個viewmodel都被緩存了。這會導致狀態dropown列表的值每次都恢復爲原始值。 – user1337493

+0

您不需要緩存整個ViewModel,只需緩存您需要的位。這不是確切的語法,但總體思路是:cache.Add(「縣」,countyCodes),viewModel.CountyCodesList = cache.Get(「縣」)。 –

0

我通過使用TempData解決了這個問題。在回發操作中,我可以從臨時數據獲取縣列表,並將ViewModel CountyCodeList設置爲此值。

+0

我希望在所有情況下都適用於您,因爲它不是TempData旨在解決的問題。它也只解決了一個用戶一次往返的問題。如果檢索縣的名單確實非常昂貴,您應該考慮一個更廣泛的解決方案,以便爲每個用戶提供每個請求。 –

+0

您是否願意詳細說明TempData的設計目的? – user1337493

+0

我在原始文章中添加了我想要達到的內容的解釋。這可能會增加我的問題的清晰度。 – user1337493