我无法从视图中获得模型

时间:2019-05-17 12:11:03

标签: c# asp.net-mvc razor

有人可以帮我吗?

我有一个模特:

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。 如何获得这些值?

1 个答案:

答案 0 :(得分:0)

当用户提交表单(然后生成对EditUser方法的[HttpPost]变量的回调)时,浏览器仅提交下拉列表的选定值,而不提交所有可能选择的列表。在服务器端,将创建视图模型的实例,并使用浏览器发送的内容进行填充。由于浏览器尚未发送所有可能选项的列表,因此该字段在ViewModel中为空。

这种行为是有道理的。您对可能性列表不感兴趣(事实上,您已经知道该列表,因为您已通过[HttpGet]方法将其发送到浏览器)。您只对用户选择的实际值感兴趣。如果ModelState无效,并且使用该ViewModel生成新的View,则需要再次重新填充AllRoles。