2009-12-14 65 views
2

對不起,如果這是一個重複的問題,我掃描了相關的問題,沒有看到任何明顯的問題。使用實體框架從ASP.NET MVC(C#)中的DropDown獲取SelectedValue

我正在使用一個實體對象的EditModel,以及其中的兩個SelectLists。問題是,一旦我達到我的POST動作,這兩個下拉列表的SelectedValues仍然是我在該模型的構造函數中設置的相同默認值,無論我在瀏覽器上選擇了什麼。

我的構造函數爲SelectedValues設置了一些默認值,但它們只是0和「」(它們在下拉列表中不是有效值)。我有一種感覺,這個問題圍繞着某個方面展開,但我會提供更多細節。

下面是模式的一個精簡版:

public class UserAccountModel 
{ 

    public UserAccount UserAccountData { get; set; } // Entity from EF 
    public SelectList Organizations { get; set; } 
    public SelectList Roles { get; set; } 

    public UserAccountModel() : this(null) 
    { 
    } 


    public UserAccountModel(UserAccount obj) 
    { 
     UserAccountData = (obj == null) ? new UserAccount() : obj; 

     // default selected value 
     int orgChildId = (UserAccountData.Organization == null) ? 0 : UserAccountData.Organization.ID; 
     string roleChildId = (UserAccountData.Role == null) ? "" : UserAccountData.Role.Name; 

     // go get the drop down options and set up the property binding 
     using (UserAccountRepository rep = new UserAccountRepository()) 
     { 
      Organizations = new SelectList(rep.GetOrganizationOptions(), "ID", "ID", orgChildId); 
      Roles = new SelectList(rep.GetRoleOptions(), "ID", "Name", roleChildId); 
     } 
    } 

    public void UpdateModel() 
    { 
     UserAccountData.Organization = Organizations.SelectedValue as Organization; 
     UserAccountData.Role = Roles.SelectedValue as Role; 
    } 
} 

這是視圖的下拉框部分:

   <div class="field"> 
       <label for="ID">Organization:</label> 
       <%= Html.DropDownList("ID", Model.Organizations) %> 
      </div> 

      <div class="field"> 
       <label for="Name">Role:</label> 
       <%= Html.DropDownList("Name", Model.Roles) %> 
      </div> 

我可能會做一些愚蠢的和明顯的位置。使用ViewData字典時,示例更直接,但我找不到太多試圖使用SelectLists的直接模型綁定的示例。

任何幫助,非常感謝!

克里斯

+3

什麼是控制器代碼的樣子? – Lazarus 2009-12-14 00:51:52

+1

你可以發佈UserAccountData結構的一些代碼,如果你綁定到ViewModel那麼我認爲選擇列表的名稱應該是「UserAccountData.ID」和「UserAccountData.Name」,即時通訊不知道,因爲我不知道的結構UserAccountData – JOBG 2009-12-14 00:57:22

+0

UserAccountData是一個實體,其代碼由實體框架生成。但是,我應該提到的另一條信息是,組織和角色是數據庫中UserAccount表中的外鍵。當我添加UserAccount時,我希望能夠從數據庫中的現有選擇中選擇組織和角色。上面模型中的UpdateModel()方法用於將選定的組織和角色添加到UserAccountData中 – Chris 2009-12-14 02:25:01

回答

2

選擇元素只回來後的選擇了它的實際價值。在這種情況下,參數將作爲ID(組織)和名稱(角色)返回到服務器/控制器。您用於更新操作的模型應包含這些屬性,或者您的控制器操作應直接將它們作爲參數接受。模型上的列表將不會被重新填充 - 並且名稱在任何情況下都不匹配。

通過添加修改模型:

public int ID { get; set; } 
public string Name { get; set; } 

與控制行動:

public ActionResult Update(UserAccountModel userAccount) 
{ 
    ... 
} 

需要注意的是,如果有一個驗證錯誤,你需要重新填充選擇列表的屬性(重構菜單)。

+0

因此,模型上的SelectList屬性不會被更新?我期待看到SelectList上的SelectedValue更新了視圖中的實際選定值,然後我將該值從SelectList中取出並更新我的UserAccountData。如果情況並非如此,那麼我會接受您的建議並添加要更新的顯式屬性。 – Chris 2009-12-14 02:21:19

+0

不可以。由於只有選定的值以表單帖子的形式返回,它甚至沒有要用來重新填充選擇列表的數據。我總是爲枚舉(我使用IEnumerable )和我的模型中選定的值放置屬性。 – tvanfosson 2009-12-14 02:24:47

+0

我唯一的問題是,我在倉庫後面使用實體框架。我實際上是在查詢SelectLists中列出的完整對象,因爲它們非常小。結果,我已經從數據庫中獲得了整個對象。那麼您是否在您的SelectedValue ID的選擇列表中查找以獲取完整的數據? – Chris 2009-12-14 12:04:29

1

你根本都忘了的導航路徑ID屬性:)

<%= Html.DropDownList("Organization.ID", Model.Organizations) %> 
+0

我認爲這可能也很簡單,但我已經確認了路徑,我認爲它是正確的。 「組織」(複數)實際上是「組織」對象的SelectList,因此ID不作爲組織的成員存在。我認爲我需要投入Organizations.SelectedValue類型Organization,但我不確定在View中這是如何工作的(如果有的話)。儘管如此,我仍然樂於接受建議,因爲我認爲SelectedValue不會被正確設置好! – Chris 2009-12-14 12:10:06

相關問題