[英]Cannot change selected value for SelectList - MVC
我试图为视图中的表中的每个记录生成一个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)? 还是我还想念什么? 我曾尝试过Google,但仍然不明白我在做什么错。 我看着这个问题SelectList选定值问题-堆栈溢出,但这似乎不起作用。
更新:
这是模型:
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;
}
如果我们可以看到您的视图正在使用的模型,这将很有帮助。 无论如何,您都很难做到这一点。
首先, DropDownList
仅需要IEnumerable<SelectListItem>
。 Razor将负责创建SelectList
实例并绑定适当的选定值。 实际上,无论如何,这都是为什么,这就是为什么您自己选择项目的尝试将是徒劳的,直到您发现导致错误或无价值的约束。
在这方面,各地的一切都围绕ModelState
,这是从由值的Request
, ViewBag
/ ViewData
, 最后 Model
。 “最后”部分很重要,因为请求或视图数据中的任何内容将始终覆盖模型上设置的任何内容。
换句话说,如果您的操作具有诸如accessLevels
类的参数,或者您正在诸如ViewBag.AccessLevels
类的ViewBag.AccessLevels
。 这些值将用作下拉菜单的“选定”值。
同样,在这里查看视图模型会有所帮助,但是通常来说,您应该将*For
帮助者系列与视图模型结合使用。 理想情况下,您应该在模型上具有一个属性,如AccessLevels
,然后执行以下操作:
@Html.DropDownListFor(m => m.AccessLevels, Model.AccessLevelOptions)
其中AccessLevelOptions
为IEnumerable<SelectListItem>
并包含可用的访问级别。 这样,您将永远不会对所选值产生任何问题,因为Razor会处理所有事情,并且您与模型上的特定属性紧密相关。 只有当您开始使用字符串名称,并且与任何东西都没有真正的联系时,事情才开始出现问题。
这应该为您的下拉菜单选择了以下项目:
public IEnumerable<SelectListItem> AccessLevelsWithSelectedItem(string selectedAccessLevelID)
{
return DB.AccessLevels
.Select(x => new SelectListItem
{
Value = x.AccessLevelID.ToString(),
Text = x.Name,
Selected = x.AccessLevelID.ToString() == selectedAccessLevelID
});
}
您可以只传递硬编码字符串的value属性或该属性的模型值:
@Html.DropDownList("Accesslevels", user.AccessLevelsWithSelectedItem, new { @class = "form-control", @name = "accessLevels", Value = "something" })
要么
@Html.DropDownList("Accesslevels", user.AccessLevelsWithSelectedItem, new { @class = "form-control", @name = "accessLevels", Value = Model.MyProperty })
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.