如何在 MVC6 中获取 DropDownListFor 的值

How to get the value of a DropDownListFor in MVC6

我一直在浏览堆栈寻找答案,我看到了很多不同的方法,none 当我尝试时,其中的一些方法是有效的。所以也许我在我的代码中做了一些根本性的错误。

我有一个如下所示的下拉列表:

@Html.DropDownListFor(m => m.PrivilegesGroups.First().Id, new SelectList(Model.PrivilegesGroups, "Id", "Name"), new { id = "PrivilegeGroupIdDDL", @class = "tableInput" })

这是我的模型。

namespace My.Internal.Models {
  public class UserViewModel {
    public User User { get; set; }
    public IEnumerable<PrivilegeGroup> PrivilegesGroups { get; set; }
    public IEnumerable<Company> UserCompanies { get; set; }
  }
}

其中 User 是 class,具有 Id、Name、UsersCompanyId 和 PrivilegeGroupId。

PrivilegeGroup 是一个 class 具有:Id,Name。

公司是 class,具有:Id、姓名。

我的保存控制器是这样的。

    [HttpPost]
    public IActionResult ManageUsers(UserViewModel model) {
        UserDao db = new UserDao();
        User modelToSave = new User();
        db.AddUpdateUser(modelToSave);
        return RedirectToAction("ManageUsers");          
    }

我已经尝试了不同的方法来获取所选下拉列表项的值,但还没有设法让它在 UserViewModel 中返​​回。

如能提供有关如何获取所选项目 ID 的任何帮助,我们将不胜感激。

你在这里主要做错了两件事。首先,您不能在这样的表达式中执行函数:

 m => m.PrivilegesGroups.First().Id

您必须在调用表达式之前执行。向您的 ViewModel 添加一个变量以包含此结果,或者将方法执行到您视图中的局部变量中(不推荐,但它会起作用)

另一个问题是你覆盖了 id:

new { id = "PrivilegeGroupIdDDL", @class = "tableInput" })

这不好,因为您剥夺了助手防止 ID 冲突的能力。这可能会导致无效 HTML 和意外结果。

就回到 UserViewModel 而言,您是否正确使用了 Html.BeginForm()?

编辑:

要将 ID 添加到您的模型,只需执行以下操作:

public class UserViewModel {
    public User User { get; set; }
    public int PrivelegesId { get; set; }
    public IEnumerable<PrivilegeGroup> PrivilegesGroups { get; set; }
    public IEnumerable<Company> UserCompanies { get; set; }
}

然后在您的控制器中执行查询:

model.PrivelegesId = myQuery.PrivelegesGroup.First().Id;

然后在您的下拉列表中:

DropDownListFor(m => m.PrivilegesId, 
   new SelectList(Model.PrivilegesGroups, "Id", "Name"), new { @class = "tableInput" })

我不知道你的Controller代码是什么样的,所以我只是猜测了变量名,但你应该能猜出来。