如何在 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代码是什么样的,所以我只是猜测了变量名,但你应该能猜出来。
我一直在浏览堆栈寻找答案,我看到了很多不同的方法,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代码是什么样的,所以我只是猜测了变量名,但你应该能猜出来。