ViewModel 更新为 Ajax,模型未绑定
ViewModel Updated with Ajax, Model does not bind
我有一些组织作为客户。每个组织下都有几个用户。在视图中,当从下拉列表中选择一个组织时,该特定组织下的用户将使用 Ajax 从数据库中更新。当我 post 模型时,用户列表为空。我尝试了几种选择,但似乎没有任何效果。这是我的最终代码的简化版本。
public class AccessModel
{
public List<Organization> AllOrganizations { get; set; }
public List<UserModel> Users { get; set; }
//and several other properties
}
我的获取操作
[HttpGet]
public ActionResult GrantAccess()
{
var model = new AccessModel();
model.AllOrganizations = db.Organizations.ToList();
return View(model);
}
我的观点
@model MyModels.AccessModel
@using (Html.BeginForm("GrantAccess", "Access", FormMethod.Post))
{
<div>
@Html.DropDownList("Organizations", new SelectList(Model.AllOrganizations, "Id", "Name"),
"choose", new { htmlAttributes = new { @onchange = "getUsers(this.value)" })
</div>
<div id="Users">
@{Html.RenderPartial("_UsersList", Model.Users);}
</div>
}
我的Jquery
<script>
function getUsers(str) {
$("#Users").load('@(Url.Action("ReturnUsers", "Product", null))?orgNumber=' + str);
}
</script>
从 Ajax
调用时呈现部分页面的我的操作
public ActionResult ReturnUsers(int orgNumber)
{
var usersList= db.Users.Where(u => u.OrganizationId == orgNumber).ToList();
var model= new AccessModel();
model.Users = usersList;
return PartialView("_UsersList", model);
}
部分页面_UsersList.cshtml
@model AccessModel
@if (Model.Users != null)
{
foreach (var item in Model.Users)
{
<fieldset>
@Html.HiddenFor(modelItem => item.User.Id)
@Html.CheckBoxFor(modelItem => item.isSelected)
@Html.DisplayFor(modelItem => item.User.LastName)
@Html.DisplayFor(modelItem => item.User.FirstName)
</fieldset>
}
}
最后,Post 行动
[HttpPost]
public ActionResult GrantAccess(AccessModel model)
{
//here model.Users is null!
}
视图显示用户正常,只是值没有传递到我的 Post 模型。有什么建议吗?
如果您使用 for
循环而不是 foreach
,名称属性将以模型绑定器可以拾取的格式呈现。
@model AccessModel
@if (Model.Users != null)
{
@for (var i = 0; i < Model.Users.Count; i++)
{
<fieldset>
@Html.HiddenFor(modelItem => Model.Users[i].Id)
@Html.CheckBoxFor(modelItem => Model.Users[i].isSelected)
@Html.DisplayFor(modelItem => Model.Users[i].LastName)
@Html.DisplayFor(modelItem => Model.Users[i].FirstName)
</fieldset>
}
}
我有一些组织作为客户。每个组织下都有几个用户。在视图中,当从下拉列表中选择一个组织时,该特定组织下的用户将使用 Ajax 从数据库中更新。当我 post 模型时,用户列表为空。我尝试了几种选择,但似乎没有任何效果。这是我的最终代码的简化版本。
public class AccessModel
{
public List<Organization> AllOrganizations { get; set; }
public List<UserModel> Users { get; set; }
//and several other properties
}
我的获取操作
[HttpGet]
public ActionResult GrantAccess()
{
var model = new AccessModel();
model.AllOrganizations = db.Organizations.ToList();
return View(model);
}
我的观点
@model MyModels.AccessModel
@using (Html.BeginForm("GrantAccess", "Access", FormMethod.Post))
{
<div>
@Html.DropDownList("Organizations", new SelectList(Model.AllOrganizations, "Id", "Name"),
"choose", new { htmlAttributes = new { @onchange = "getUsers(this.value)" })
</div>
<div id="Users">
@{Html.RenderPartial("_UsersList", Model.Users);}
</div>
}
我的Jquery
<script>
function getUsers(str) {
$("#Users").load('@(Url.Action("ReturnUsers", "Product", null))?orgNumber=' + str);
}
</script>
从 Ajax
调用时呈现部分页面的我的操作public ActionResult ReturnUsers(int orgNumber)
{
var usersList= db.Users.Where(u => u.OrganizationId == orgNumber).ToList();
var model= new AccessModel();
model.Users = usersList;
return PartialView("_UsersList", model);
}
部分页面_UsersList.cshtml
@model AccessModel
@if (Model.Users != null)
{
foreach (var item in Model.Users)
{
<fieldset>
@Html.HiddenFor(modelItem => item.User.Id)
@Html.CheckBoxFor(modelItem => item.isSelected)
@Html.DisplayFor(modelItem => item.User.LastName)
@Html.DisplayFor(modelItem => item.User.FirstName)
</fieldset>
}
}
最后,Post 行动
[HttpPost]
public ActionResult GrantAccess(AccessModel model)
{
//here model.Users is null!
}
视图显示用户正常,只是值没有传递到我的 Post 模型。有什么建议吗?
如果您使用 for
循环而不是 foreach
,名称属性将以模型绑定器可以拾取的格式呈现。
@model AccessModel
@if (Model.Users != null)
{
@for (var i = 0; i < Model.Users.Count; i++)
{
<fieldset>
@Html.HiddenFor(modelItem => Model.Users[i].Id)
@Html.CheckBoxFor(modelItem => Model.Users[i].isSelected)
@Html.DisplayFor(modelItem => Model.Users[i].LastName)
@Html.DisplayFor(modelItem => Model.Users[i].FirstName)
</fieldset>
}
}