2010-12-15 72 views
1

控制器代碼:MVC 2-更新模型數據時模型是IEnumerable類型的/ IQueryable的

Function ManagePages() As ActionResult 
    Dim pages = contentRepository.GetAllContentPagesByType("Content Page", False) 
    Return View("ManagePages", pages) 
End Function 

<HttpPost()> _ 
Function ManagePages(ByVal values As FormCollection) As ActionResult 
    Dim pages = contentRepository.GetAllContentPagesByType("Content Page", False) 
    ''' **** HOW DO I UPDATE THE MODEL HERE **** 
    contentRepository.Save() 'Simply calls SubmitChanges() 
    Return View("ManagePages", pages) 
End Function 

GetAllContentPagesByType返回一個IQueryable - 一個LINQ到SQL查詢的結果。視圖是強類型:

Inherits="System.Web.Mvc.ViewPage(Of IQueryable (Of DBContent))" 

我通過每個DBContent對象的視圖中的循環和幾個屬性創建文本框和其他輸入 - 基本上我爲顯示模型中的每個記錄的編輯。這工作正常。

現在,我已經嘗試了許多不同的方式來得到這個更新:

  • 調用的UpdateModel(),然後 的SubmitChanges()在LINQ數據 背景 - 什麼也沒做。
  • 隨後菲爾 哈克的「綁定到列表」教程, 但它並沒有深入去儘可能 更新模型: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
  • 參數類型的二手變化 到HttpPost爲ManagePages到 沒有無濟於事。

我現在想想得到它的唯一方法是循環遍歷FormCollection參數中的所有項目,並手動更新集合中的每個DBContent記錄,但這看起來不像最佳實踐解決方案。

問題是 - 這種情況下更新任何枚舉類型模型的黃金標準最佳實踐是什麼?

編輯

如果有幫助,這裏的視圖代碼片段。請注意,使用Html.TextBox等,似乎不會影響結果表單數據。我總是得到4個表單鍵,用逗號分隔值(基本上每個屬性都有一個)。我試着與記錄ID(唯一鍵)前面加上這些,但的UpdateModel()仍然無法正常工作,但我得到的每個輸入控制形成了獨特的價值:

<% Using Html.BeginForm%> 
    <% For Each item In Model.OrderBy(Function(c) c.DisplayOrder)%> 
    <%: Html.Hidden("ContentId", Model.ContentId.ToString())%> 
    <tr> 
     <td class="first"><input name='Enabled' type="checkbox" checked='<%: If(Model.Enabled, "checked", "")%>' /></td> 
     <td class="first"><input name='DisplayOrder' type="text" value='<%: Model.DisplayOrder %>' style="width:40px" /></td> 
     <td class="first"><select name='ContentLevel'> 
      <option value="100" selected='<%: If(Model.ContentLevel = 100, "selected", "") %>'>Admin</option> 
      <option value="50" selected='<%: If(Model.ContentLevel = 50, "selected", "") %>'>Board</option> 
      <option value="25" selected='<%: If(Model.ContentLevel = 25, "selected", "") %>'>Member</option> 
      <option value="0" selected='<%: If(Model.ContentLevel = 0, "selected", "") %>'>Everyone</option> 
     </select></td> 
     <td><a href="EditPage/<%: Model.ContentId %>"><%: Model.PageTitle%></a></td> 
     <td><%: Model.aspnet_User.UserName%></td> 
     <td class="last"><%: Model.ModifiedOn%></td> 
    </tr> 
    <% Next%> 
<% End Using%> 
+0

如果我理解正確,真正的問題是你似乎想要更新視圖中的數據?該視圖只能輸出HTML和相關內容。如果您希望更改保持不變,則需要向服務器發回請求以應用更改的值的操作。 – 2010-12-15 17:39:41

+0

該視圖有一個簡單的提交按鈕:'' - 點擊此按鈕將觸發 ManagePages(formCollection)方法。在這個方法中,我們傳統上會爲大多數對象調用UpdateModel(),但是需要明顯地處理不同的列表。 – Keith 2010-12-15 17:44:02

+0

啊,沒關係,對不起,我錯過了你的問題中的那一部分。 – 2010-12-15 17:47:30

回答

0

我按照Phil Haack的帖子,以索引「[0.]」作爲前綴開始爲每個控件提供一個唯一的名稱。然後,我將Action方法更改爲接受正確綁定模型數據的List(of DBContent)。然後,我可以手動循環訪問該集合,並手動更新每條記錄。

0

你根本不會做調用UpdateModel來更新集合。

<HttpPost()> _ 
Function ManagePages(ByVal values As FormCollection) As ActionResult 
    Dim pages = contentRepository.GetAllContentPagesByType("Content Page", False) 

    UpdateModel(pages) 

    contentRepository.Save() 'Simply calls SubmitChanges() 
    Return View("ManagePages", pages) 
End Function 

這裏需要按照指示: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

<input>元素的name屬性需要遵循特定的語法,這個工作。

+0

UpdateModel()不做任何事情,正如我上面提到的。根本沒有錯誤。 – Keith 2010-12-15 18:02:11

+0

我已經爲我的問題添加了更多信息,包括視圖的代碼片段。 – Keith 2010-12-15 18:16:40

相關問題