有人可以帮我吗?
我有一个模特:
public class EditUserVM
{
public string Role {get;set;}
public IEnumerable<SelectListItem> AllRoles { get; set; }
}
我有一个控制器:
public class AdminController : Controller
{
// GET: Admin/Admin/EditUser/id
[HttpGet]
public ActionResult EditUser(string id)
{
ApplicationUser user = UserManager.FindById(id);
EditUserVM model;
//model initialization
return View(model);
}
// POST: Admin/Admin/EditUser
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> EditUser(EditUserVM model)
{
if (!ModelState.IsValid)
{
return View(model);
}
//code
return View(model);
}
}
我有一个看法:
@model EditUserVM
@using (Html.BeginForm())
{
<div class="form-group">
@Html.LabelFor(model => model.Role, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("Role", Model.AllRoles, new { @class= "btn btn-light"})
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-success" />
</div>
</div>
}
但是,当我单击“保存”按钮时,在后控制器操作中,我不会得到model.AllRoles
。
如何获得这些值?
答案 0 :(得分:0)
当用户提交表单(然后生成对EditUser方法的[HttpPost]变量的回调)时,浏览器仅提交下拉列表的选定值,而不提交所有可能选择的列表。在服务器端,将创建视图模型的实例,并使用浏览器发送的内容进行填充。由于浏览器尚未发送所有可能选项的列表,因此该字段在ViewModel中为空。
这种行为是有道理的。您对可能性列表不感兴趣(事实上,您已经知道该列表,因为您已通过[HttpGet]方法将其发送到浏览器)。您只对用户选择的实际值感兴趣。如果ModelState无效,并且使用该ViewModel生成新的View,则需要再次重新填充AllRoles。