首页 > 解决方案 > 我无法从视图中获取模型

问题描述

有人可以帮助我吗?

我有一个模型:

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我的意思是model.AllRoles == null. 我怎样才能得到这些值?

标签: c#asp.net-mvcrazor

解决方案


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

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


推荐阅读