我可以为所选用户获得所有角色和实际角色,但是当我发布到EditUser操作时,Dropdownlist会发送null。 我的意思是当表单发布到我的控制器时,我从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获取 /提前致谢!
答案 0 :(得分:1)
表单回发成功表单控件的名称/值对。您使用<select>
生成name="RoleId"
元素,但您的模型不包含名为RoleId
的属性。由于您要将所选选项绑定到ApplicationRoleId
角色属性,因此您需要查看
@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
)答案 1 :(得分:0)
因为您声明在控制器的该方法中只允许HttpGet方法。这就是为什么