使用实体框架从ASP.NET MVC(C#)中的DropDown获取SelectedValue

问题描述:

对不起,如果这是一个重复的问题,我扫描了相关的问题,没有看到任何明显的问题。使用实体框架从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

选择元素只回来后的选择了它的实际价值。在这种情况下,参数将作为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

你根本都忘了的导航路径ID属性:)

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

我认为这可能也很简单,但我已经确认了路径,我认为它是正确的。 “组织”(复数)实际上是“组织”对象的SelectList,因此ID不作为组织的成员存在。我认为我需要投入Organizations.SelectedValue类型Organization,但我不确定在View中这是如何工作的(如果有的话)。尽管如此,我仍然乐于接受建议,因为我认为SelectedValue不会被正确设置好! – Chris 2009-12-14 12:10:06