在 ASP.NET MVC 中发布到控制器后,下拉列表值为空
Dropdownlist value is null after posting to controller in ASP.NET MVC
我可以获得所有角色以及所选用户的实际角色,但是当我发布到 EditUser 操作时,Dropdownlist 发送空值。
我的意思是当表单发布到我的控制器时,我从 DropDownList 中得到 null。
这是我的模型
public class EditUserViewModel
{
public string Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public List<SelectListItem> ApplicationRoles { get; set; }
public string ApplicationRoleId { get; set; }
}
这是行动
[HttpGet]
public async Task<ActionResult> EditUser(string id)
{
EditUserViewModel model = new EditUserViewModel();
model.ApplicationRoles = RoleManager.Roles.Select(r => new SelectListItem
{
Text = r.Name,
Value = r.Id
}).ToList();
if (!String.IsNullOrEmpty(id))
{
ApplicationUser user = await UserManager.FindByIdAsync(id);
if (user != null)
{
var role = await UserManager.GetRolesAsync(user.Id);
var existingRole = role.First();
string existingRoleId = RoleManager.Roles.Single(r => r.Name == existingRole).Id;
model.Id = user.Id;
model.FirstName = user.FirstName;
model.ApplicationRoleId = existingRoleId;
ViewBag.RoleId = new SelectList(RoleManager.Roles, "Id", "Name", model.ApplicationRoleId);
}
}
return PartialView("_EditUser", model);
}
这里是来自 _EditUser.cshtml
的 DropDownlist
<div class="form-group">
@Html.Label("Role typ", htmlAttributes: new { @class = "control-label col-md-6" })
<div class="col-md-12" title="Ange antal datorer som finns i lager">
@Html.DropDownList("RoleId", null, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.ApplicationRoles, "", new { @class = "text-danger" })
</div>
</div>
仅从 DropDownList 获取 null,而不是从@Html.EditorFor
/提前致谢!
因为您声明在控制器的该方法中只允许使用 HttpGet 方法。这就是为什么
Forms post 支持 name/value 对他们成功的表单控件。您使用 name="RoleId"
生成了 <select>
元素,但您的模型不包含名为 RoleId
的 属性。既然你要将选择的选项绑定到ApplicationRoleId
角色属性,那么你view需要是
@Html.LabelFor(m => m.ApplicationRoleId)
@Html.DropDownListFor(m => m.ApplicationRoleId, Model.ApplicationRoles)
@Html.ValidationMessageFor(m => m.ApplicationRoleId)
备注:
- 您当前的
@Html.Label(..)
代码没有创建标签
与您的下拉列表相关联(点击它不会设置
焦点)
ValidationMessageFor()
需要应用到 属性 你的
绑定到,而不是 SelectList
- 删除你的
ViewBag.RoleId = new SelectList(..)
代码。你有
已将选择列表分配给 ApplicationRoles
属性
(如果有视图模型,你永远不需要 ViewBag
)
我可以获得所有角色以及所选用户的实际角色,但是当我发布到 EditUser 操作时,Dropdownlist 发送空值。 我的意思是当表单发布到我的控制器时,我从 DropDownList 中得到 null。
这是我的模型
public class EditUserViewModel
{
public string Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public List<SelectListItem> ApplicationRoles { get; set; }
public string ApplicationRoleId { get; set; }
}
这是行动
[HttpGet]
public async Task<ActionResult> EditUser(string id)
{
EditUserViewModel model = new EditUserViewModel();
model.ApplicationRoles = RoleManager.Roles.Select(r => new SelectListItem
{
Text = r.Name,
Value = r.Id
}).ToList();
if (!String.IsNullOrEmpty(id))
{
ApplicationUser user = await UserManager.FindByIdAsync(id);
if (user != null)
{
var role = await UserManager.GetRolesAsync(user.Id);
var existingRole = role.First();
string existingRoleId = RoleManager.Roles.Single(r => r.Name == existingRole).Id;
model.Id = user.Id;
model.FirstName = user.FirstName;
model.ApplicationRoleId = existingRoleId;
ViewBag.RoleId = new SelectList(RoleManager.Roles, "Id", "Name", model.ApplicationRoleId);
}
}
return PartialView("_EditUser", model);
}
这里是来自 _EditUser.cshtml
的 DropDownlist<div class="form-group">
@Html.Label("Role typ", htmlAttributes: new { @class = "control-label col-md-6" })
<div class="col-md-12" title="Ange antal datorer som finns i lager">
@Html.DropDownList("RoleId", null, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.ApplicationRoles, "", new { @class = "text-danger" })
</div>
</div>
仅从 DropDownList 获取 null,而不是从@Html.EditorFor /提前致谢!
因为您声明在控制器的该方法中只允许使用 HttpGet 方法。这就是为什么
Forms post 支持 name/value 对他们成功的表单控件。您使用 name="RoleId"
生成了 <select>
元素,但您的模型不包含名为 RoleId
的 属性。既然你要将选择的选项绑定到ApplicationRoleId
角色属性,那么你view需要是
@Html.LabelFor(m => m.ApplicationRoleId)
@Html.DropDownListFor(m => m.ApplicationRoleId, Model.ApplicationRoles)
@Html.ValidationMessageFor(m => m.ApplicationRoleId)
备注:
- 您当前的
@Html.Label(..)
代码没有创建标签 与您的下拉列表相关联(点击它不会设置 焦点) ValidationMessageFor()
需要应用到 属性 你的 绑定到,而不是SelectList
- 删除你的
ViewBag.RoleId = new SelectList(..)
代码。你有 已将选择列表分配给ApplicationRoles
属性 (如果有视图模型,你永远不需要ViewBag
)