所以我要做的是,我有一个角色的数据库表,我想在下拉列表中显示它,并将值发送到另一个控制器函数。但是,当我尝试这样做时,我不会收到从下拉列表中选择的新角色的值,而是收到以前在我的模型中的值。这是我的CSHTML:代码
@model IEnumerable<OnlineStoreData.Model.User>
<h4>List of Users: </h4>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.UserName)
</th>
<th></th>
</tr>
@foreach (var user in Model) {
if (user.Role.RoleName.TrimEnd(' ') == "User")
{
<tr>
<td>
@Html.DisplayFor(modelItem => user.UserName)
</td>
<td>
@Html.DropDownListFor(modelItem => user.Role.RoleName, new SelectList(ViewBag.RoleList)) //Here I need to select a new Role, for example "Admin"
@Html.ActionLink("Promote", "Promote", new { id = user.UserId, role = user.Role.RoleName }) |
@Html.ActionLink("Delete", "Delete", new { id = user.UserId })
</td>
</tr>
}
}
</table>
这是我的控制器的代码
public ActionResult ManageUsers()
{
ViewBag.RoleList = storeDBEntities.Roles.Select(role => role.RoleName).ToList();
return View(storeDBEntities.Users.ToList());
}
public ActionResult Promote(int id, string role)
{
//Here I should get the new role selected in the dropdown list, but I keep getting "User", which is the old role.
User toPromUser = storeDBEntities.Users.Find(id);
Role newRole = storeDBEntities.Roles.FirstOrDefault(r => r.RoleName == role);
if(toPromUser != null && newRole != null)
{
toPromUser.Role = newRole;
toPromUser.UserRole = newRole.RoleId;
storeDBEntities.SaveChanges();
}
return RedirectToAction("ManageUsers", "Users");
}
我不确定我应该如何解决这个问题,以使代码执行预期的操作。非常感谢。
问题是,如果没有JavaScript,您无法将下拉列表的选定值动态附加到操作链接。
我认为更优雅的方法是将下拉按钮和操作按钮放在<form>
中。这样,该方法也可以是post
,这在某种程度上更好看,因为get
操作不应该操作数据。
<td>
<form method="post" action="@Url.Action("Promote", new { id = user.UserId })">
@Html.DropDownList("role", new SelectList(ViewBag.RoleList))
<button type="submit">Promote</button>
|
@Html.ActionLink("Delete", "Delete", new { id = user.UserId })
</form>
</td>
请注意,下拉列表中的name
应与控制器的role
参数的名称相匹配。
当这起作用时,您可以将[HttpPost]
属性添加到Promote
操作中,以澄清此方法会更改某些内容。
对于您的删除操作,您可以执行类似的操作。用不同的URL制作第二个<form>
,或者以相同的形式制作一个提交按钮,并为每个按钮提供name
和value
。你点击的按钮的值将被发送到服务器-注意,我更改了表单操作URL:
<td>
<form method="post" action="@Url.Action("Update", new { id = user.UserId })">
@Html.DropDownList("role", new SelectList(ViewBag.RoleList))
<button type="submit" name="operation" value="promote">Promote</button>
|
<button type="submit" name="operation" value="delete">Delete</button>
</form>
</td>
然后决定在控制器中做什么:
[HttpPost]
public ActionResult Update(int id, string operation, string role)
{
...
最后,您可能想要一条关于删除操作的确认消息,可以这样做:
<button type="submit" name="operation" value="delete" onclick="return confirm('Do you really want to delete this user?');">Delete</button>