无法更改SelectList的选定值 - MVC

时间:2016-10-18 14:52:03

标签: c# asp.net-mvc selectlist

我试图为View中的表中的每条记录生成一个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;
}

3 个答案:

答案 0 :(得分:0)

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

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

在这方面,一切都围绕着Request,其中包含来自ViewBagViewData / Model最终 {的值{1}}。 “最终”部分很重要,因为请求或视图数据中的任何内容都始终覆盖模型上设置的任何内容。

换句话说,如果您的操作有accessLevels之类的参数,或者您正在设置类似ViewBag.AccessLevels的内容。这些值将用作下拉列表的“选定”值。

再次,看到视图模型在这里会有所帮助,但一般来说,您应该将*For系列助手与视图模型结合使用。理想情况下,您应该在模型上拥有AccessLevels之类的属性,然后执行以下操作:

@Html.DropDownListFor(m => m.AccessLevels, Model.AccessLevelOptions)

其中AccessLevelOptionsIEnumerable<SelectListItem>并包含可用的访问级别。有了这个,你将永远不会对所选值产生任何问题,因为Razor将处理所有事情,并且你很强烈地绑定到模型上的特定属性。只有当你开始玩字符串名称时,才会发现事情开始出错。

答案 1 :(得分:0)

这应该为您提供下拉列表的选定项目:

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

答案 2 :(得分:-1)

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

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