2012-09-16 44 views
0

我有雙列表框MVC。所選列表框中所有項目的Id都需要發佈到服務器上。型號有三個屬性定義在MVC中維護列表框的狀態

IEnumerable<SelectListItem> AvailItems {get;set;} 
IEnumerable<SelectListItem> SelectedItems {get;set;} 
string SelectedItemIds {get;set;} 

我已填充availItemsselectedItems列表框有不同的名稱和SelectedItemIds財產hiddenfield。如果用戶從列表框中添加/刪除項目,Javascript會更新隱藏字段。在httpost中,我只收到selectedItemIds,因爲列表框的名稱已更改,這是預期的行爲。

問題是模型無效或發生任何異常時,返回View(model)得到執行,列表框填充空值,但hiddenfield包含修改項的值。當用戶再次提交頁面時,hiddenfield的值會發布,但顯示的項目將來自數據庫。我遵循這種使用hiddenfield的方法,而不是在提交之前選擇所有項目(使用javascript),因爲如果非js用戶提交頁面,它不會造成危害。 hiddenfield的值會被拾取。

有關如何處理上述情況的任何想法?

回答

1

爲什麼不在View(model)之前將這些信息重新填充到模型中?我假設您的代碼類似於:

if (ModelState.IsValid) 
{ 
    //...all is ok 
} 
else 
{ 
    model.AvailItems = // repopulate 
    model.SelectedItems = // repopulate 
    return View(model); 
} 
+0

是的,所以modelstate消失了,即用戶新添加/刪除的項目消失了。 – Sunny

+0

您的意思是您在隱藏字段中選擇的ID未被考慮在內?您可以隨時解析其中的值並選擇$(document).ready()中的項目,或者在渲染視圖之前解析它的服務器端並調整SelectedItems,否? –

+0

@Romeo,我有雙重列表,即一個列表框包含可用項目,當用戶選擇任何項目時,它們被推送到其他列表框2。提交時,需要保存listbox2中的所有項目(不僅僅是選定的項目)。隱藏字段包含listbox2項目的id,並且在添加/刪除項目時在客戶端上進行操作。現在,如果模型無效,則listbox2項目將從db和來自modelstate的隱藏字段中填充,即如果用戶將新項目5添加到現有項目2,3。隱藏字段包含2,3,5但顯示爲2,3。如果他重新提交該頁面,則2,3,5項目已發佈。希望我現在清楚。 – Sunny