使用实体框架从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的直接模型绑定的示例。
任何帮助,非常感谢!
克里斯
选择元素只回来后的选择了它的实际价值。在这种情况下,参数将作为ID(组织)和名称(角色)返回到服务器/控制器。您用于更新操作的模型应包含这些属性,或者您的控制器操作应直接将它们作为参数接受。模型上的列表将不会被重新填充 - 并且名称在任何情况下都不匹配。
通过添加修改模型:
public int ID { get; set; }
public string Name { get; set; }
与控制行动:
public ActionResult Update(UserAccountModel userAccount)
{
...
}
需要注意的是,如果有一个验证错误,你需要重新填充选择列表的属性(重构菜单)。
因此,模型上的SelectList属性不会被更新?我期待看到SelectList上的SelectedValue更新了视图中的实际选定值,然后我将该值从SelectList中取出并更新我的UserAccountData。如果情况并非如此,那么我会接受您的建议并添加要更新的显式属性。 – Chris 2009-12-14 02:21:19
不可以。由于只有选定的值以表单帖子的形式返回,它甚至没有要用来重新填充选择列表的数据。我总是为枚举(我使用IEnumerable
我唯一的问题是,我在仓库后面使用实体框架。我实际上是在查询SelectLists中列出的完整对象,因为它们非常小。结果,我已经从数据库中获得了整个对象。那么您是否在您的SelectedValue ID的选择列表中查找以获取完整的数据? – Chris 2009-12-14 12:04:29
你根本都忘了的导航路径ID属性:)
<%= Html.DropDownList("Organization.ID", Model.Organizations) %>
我认为这可能也很简单,但我已经确认了路径,我认为它是正确的。 “组织”(复数)实际上是“组织”对象的SelectList,因此ID不作为组织的成员存在。我认为我需要投入Organizations.SelectedValue类型Organization,但我不确定在View中这是如何工作的(如果有的话)。尽管如此,我仍然乐于接受建议,因为我认为SelectedValue不会被正确设置好! – Chris 2009-12-14 12:10:06
什么是控制器代码的样子? – Lazarus 2009-12-14 00:51:52
你可以发布UserAccountData结构的一些代码,如果你绑定到ViewModel那么我认为选择列表的名称应该是“UserAccountData.ID”和“UserAccountData.Name”,即时通讯不知道,因为我不知道的结构UserAccountData – JOBG 2009-12-14 00:57:22
UserAccountData是一个实体,其代码由实体框架生成。但是,我应该提到的另一条信息是,组织和角色是数据库中UserAccount表中的外键。当我添加UserAccount时,我希望能够从数据库中的现有选择中选择组织和角色。上面模型中的UpdateModel()方法用于将选定的组织和角色添加到UserAccountData中 – Chris 2009-12-14 02:25:01