无法更改 SelectList 的选定值 - MVC

Cannot change selected value for SelectList - MVC

我正在尝试为视图中 table 中的每条记录生成一个 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 Constructor (IEnumerable, Object)?或者我还缺少什么?我已经尝试 google 但仍然不明白我做错了什么。我查看了这个问题 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; }

}

更新二:

我现在可以使用它并更新了我的模型和存储库。

型号:

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;
}

您可以只传入硬编码字符串的值属性或该字符串的模型值 属性:

@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 })

如果我们能看到您的视图正在使用的模型,那将会很有帮助。无论如何,你让这件事变得太难了。

首先,DropDownList只需要IEnumerable<SelectListItem>。 Razor 将负责创建一个 SelectList 实例并绑定适当的选定值。事实上,无论如何它都会这样做,这就是为什么您自己选择项目的尝试将毫无结果,直到您找到导致错误或没有绑定值的原因。

在这方面,一切都围绕 ModelState 展开,它由 RequestViewBag/ViewData 最后 Model。 "finally" 部分很重要,因为请求或视图数据中的任何内容都会 始终 覆盖模型上设置的任何内容。

换句话说,如果您的操作具有 accessLevels 之类的参数,或者您正在设置 ViewBag.AccessLevels 之类的参数。这些值将用作下拉列表的 "selected" 值。

同样,查看视图模型在这里会有所帮助,但一般来说,您应该将 *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
          });
    }