【发布时间】:2016-10-18 14:52:03
【问题描述】:
我正在尝试为视图中的表中的每条记录生成一个 DropDownList。我无法为下拉列表设置选定的值。
在控制器中,模型中每个用户的访问级别列表通过调用存储库中的方法来填充。我似乎无法完全正确地使用这种方法。我可以更改项目上的选定值,并且 accessLevels 选择了正确的值。但在视图中,这不是选定的值。如何设置选择列表的选定值?
我试过了:
存储库:
public IEnumerable<SelectListItem> GetSelectListAccessLevelsWithSelectedItem(string selectedAccessLevelID)
{
IEnumerable<SelectListItem> accessLevelsFromDB = DB.AccessLevels
.Select(x => new SelectListItem
{
Value = x.AccessLevelID.ToString(),
Text = x.Name
});
SelectListItem item = null;
foreach (SelectListItem a in accessLevelsFromDB)
{
if (a.Value == selectedAccessLevelID)
{
item = a;
a.Selected = true;
}
}
var accessLevels = new SelectList(accessLevelsFromDB, item.Value);
return accessLevels;
}
还尝试返回 accessLevelsFromDB:
return accessLevelsFromDB;
查看:
@Html.DropDownList("Accesslevels", user.AccessLevelsWithSelectedItem, new { @class = "form-control", @name = "accessLevels"})
我是否正确使用了 SelectList 构造函数(IEnumerable、Object)?或者我还缺少什么?我试图谷歌,但仍然不明白我做错了什么。我看了这个问题SelectList Selected Value Issue - Stack Overflow,但这似乎不起作用。
更新:
这是模型:
public class EditCustomerViewModel
{
public Customer Customer { get; set; }
public int CustomerID { get; set; }
public List<User> Users { get; set; }
public List<UserToView> UsersToView { get; set; }
public IEnumerable<SelectListItem> AccessLevelListForSelectedUser { get; set; }
}
更新 2:
我现在已经可以使用它并更新了我的模型和存储库。
型号:
public class EditCustomerViewModel
{
public Customer Customer { get; set; }
public int CustomerID { get; set; }
public List<UserToView> UsersToView { get; set; }
}
存储库:
public IEnumerable<SelectListItem> GetSelectListAccessLevelsWithSelectedItem(string selectedAccessLevelID)
{
IEnumerable<SelectListItem> accessLevelsFromDB = DB.AccessLevels
.Select(x => new SelectListItem
{
Value = x.AccessLevelID.ToString(),
Text = x.Name,
Selected = x.AccessLevelID.ToString() == selectedAccessLevelID
});
return accessLevelsFromDB;
}
【问题讨论】:
-
您的视图模型没有名为
Accesslevels的属性,因此您甚至没有绑定到任何东西。并且当绑定到属性时,您没有设置SelectListItem的Selected属性(它的属性值决定了选择的内容(该方法在内部构建自己的SelectList)。var accessLevels = new SelectList(accessLevelsFromDB, item.Value);没有任何意义,因为@ 987654333@ 已经是SelectList -
并且视图模型在编辑时不应该包含数据模型
-
AccessLevelsWithSelectedItem 是模型中属性 UsersToView 中每个用户的属性,我正在尝试绑定到此属性。我应该将“AccessLevelsWithSelectedItem”作为下拉列表的第一个字符串参数还是我误解了?
-
是的,但是如果你生成这个是一个循环,那么即使这样也不会绑定。您接受的答案完全具有误导性。
Selected属性会被DropDownList()方法忽略,除非您没有绑定到某个属性 - 在您的情况下您没有(提交时它不会绑定到您的模型)。我建议你阅读MVC5 Razor html.dropdownlistfor set selected when value is in array
标签: c# asp.net-mvc selectlist