C# 无法更改SelectList-MVC的选定值

C# 无法更改SelectList-MVC的选定值,c#,asp.net-mvc,selectlist,C#,Asp.net Mvc,Selectlist,我试图为视图中表中的每条记录生成一个DropDownList。我无法设置dropdownlist的选定值 在控制器中,通过调用存储库中的方法来填充模型中每个用户的访问级别列表。我似乎不能完全正确地使用这个方法。我可以更改项目上的选定值,并且AccessLevel已选择正确的值。但在视图中,这不是选定的值。如何设置selectlist的选定值 我试过这个: 存储库: public IEnumerable<SelectListItem> GetSelectListAccessLevels

我试图为视图中表中的每条记录生成一个DropDownList。我无法设置dropdownlist的选定值

在控制器中,通过调用存储库中的方法来填充模型中每个用户的访问级别列表。我似乎不能完全正确地使用这个方法。我可以更改项目上的选定值,并且AccessLevel已选择正确的值。但在视图中,这不是选定的值。如何设置selectlist的选定值

我试过这个:

存储库:

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;
        }
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;
}
视图:

我是否正确使用了SelectList构造函数(IEnumerable,Object)?或者我还缺少什么?我试过谷歌,但仍然不明白我做错了什么。我看了这个问题,但这似乎不起作用

更新:

这就是模型:

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类editCustomerServiceWModel
{
公共客户客户{get;set;}
public int CustomerID{get;set;}
公共列表用户{get;set;}
公共列表用户stoview{get;set;}
公共IEnumerable AccessLevelListForSelectedUser{get;set;}
}
更新2:

我现在已经让它工作了,并且已经更新了我的模型和存储库

型号:

public class EditCustomerViewModel
    {
        public Customer Customer { get; set; }
        public int CustomerID { get; set; }
        public List<UserToView> UsersToView { get; set; }

    }
public类editCustomerServiceWModel
{
公共客户客户{get;set;}
public int CustomerID{get;set;}
公共列表用户stoview{get;set;}
}
存储库:

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;
        }
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;
}
public IEnumerable GetSelectListAccessLevelsWithSelectedItem(字符串selectedAccessLevelID)
{
IEnumerable accessLevelsFromDB=DB.AccessLevels
.选择(x=>new SelectListItem
{
Value=x.AccessLevelID.ToString(),
Text=x.名称,
Selected=x.AccessLevelID.ToString()==selectedAccessLevelID
});
返回accessLevelsFromDB;
}

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

@Html.DropDownList("Accesslevels", user.AccessLevelsWithSelectedItem, new { @class = "form-control", @name = "accessLevels", Value = "something" })


如果我们能看到您的视图使用的模型,这将非常有用。不管怎样,你把这件事弄得太难了

首先,
DropDownList
只需要
IEnumerable
。Razor将负责创建一个
SelectList
实例并绑定相应的选定值。事实上,不管怎样,这就是为什么你自己选择一个项目的尝试将是徒劳的,直到你发现是什么导致了错误或没有价值被绑定

在这方面,一切都围绕着
ModelState
,它由
Request
ViewBag
/
ViewData
以及最后的
Model
中的值组成。“finally”部分很重要,因为请求或视图数据中的任何内容都将始终覆盖模型上设置的任何内容

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

同样,在这里查看视图模型会很有帮助,但一般来说,您应该将
*For
助手系列与视图模型结合使用。理想情况下,您的模型上应该有一个属性,如
AccessLevels
,然后执行以下操作:

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

其中
AccessLevelOptions
将是
IEnumerable
,并包含可用的访问级别。这样,您将永远不会对所选值有任何问题,因为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
          });
    }
public IEnumerable AccessLevelsWithSelectedItem(字符串selectedAccessLevelID)
{
返回DB.AccessLevels
.选择(x=>new SelectListItem
{
Value=x.AccessLevelID.ToString(),
Text=x.名称,
Selected=x.AccessLevelID.ToString()==selectedAccessLevelID
});
}

不应混淆
属性。充其量,你是在掩饰一个更深层次的问题。在最坏的情况下,您将干扰正确的值绑定。我尝试了它,但它仍然没有更改使用模型更新的dropdownlistI的选定值。但是如果我使用这个@Html.DropDownListFor(m=>m.AccessLevels,Model.AccessLevelOptions),下拉菜单如何“知道”要选择哪个值?我需要在model.UsersToView.UserToView.AccessLevel下的模型中选择一个特定的值。这就是您应该绑定到的值。它基于
ModelState
中的内容“知道”,因此您需要组合模型,以便绑定到的属性保持其具有或应该具有的值。视图模型没有名为
Accesslevels
的属性,因此您甚至不绑定任何内容。当绑定到属性时,您不需要设置
SelectListItem
Selected
属性(它的值决定了所选内容(该方法在内部构建自己的SelectList)。并且
var accessLevels=new SelectList(accessLevelsFromDB,item.value);
毫无意义,因为
accessLevelsFromDB
已经是一个
SelectList
并且在编辑AccessLevelsWithSelectedItem时,视图模型不应该包含数据模型。AccessLevelsWithSelectedItem是模型中property users to view中每个用户的属性,而我正试图绑定到该属性。我是否应该放置“AccessLevelsWithSelectedItem”作为dropdownlist的第一个字符串参数,或者我理解错误了吗?是的,但是如果生成的是循环,那么即使是这样也不会绑定。您接受的答案完全是误导性的。
Selected
属性被
dropdownlist()忽略
方法,除非您未绑定到属性-在您的情况下,您不会(它将
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
          });
    }