这是我的模型
public class AdministrationModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailAddress { get; set; }
public bool IsApproved { get; set; }
}
这是我的 Controller
public ActionResult GetTabContent(string id)
{
switch (id)
{
case "tab3":
model = GetAllUsersInfo();
viewName = "Administration";
break;
}
return View(viewName);
}
private List<AdministrationModel> GetAllUsersInfo()
{
List<AdministrationModel> userList = new List<AdministrationModel>();
foreach (MembershipUser user in Membership.GetAllUsers())
{
UserProfile userProfile = UserProfile.GetUserProfile(user.UserName);
userList.Add(new AdministrationModel { EmailAddress = user.Email, IsApproved = user.IsApproved, FirstName = userProfile.FirstName, LastName = userProfile.LastName });
}
return userList;
}
这是我的观点
@model List<AdminContainerModel>
@using (Html.BeginForm("Administration", "Account"))
{
<fieldset>
<div>
@foreach (AdministrationModel AM in Model)
{
<div>
<div class="colFull">@Html.DisplayFor(modelItem => AM.FirstName)</div>
<div class="colFull">@Html.DisplayFor(modelItem => AM.LastName)</div>
<div class="colFull">@Html.DisplayFor(modelItem => AM.EmailAddress)</div>
<div class="colPartial"><input type="checkbox" checked="@AM.IsApproved"/> </div>
<div class="clear"></div>
</div>
}
</div>
<input type="submit" value="Update Account" />
</fieldset>
}
当用户单击“更新帐户”按钮时,它将转到 Controller
[HttpPost]
public ActionResult Administration(List<AdministrationModel> model)
{
return View();
}
在此方法中,模型始终为空。然而呈现一切的 View 是完美的并且显示了我想要它显示的内容。我做错了什么?
最佳答案
当使用集合时,为了正确处理它们以便它们在发布时绑定(bind)模型而不需要任何额外的腿部工作,您需要确保它们被正确索引,您可以通过使用 for 循环来做到这一点,例如:
@for (int i = 0; i < Model.Count; i++)
{
@Html.HiddenFor(m => m[i].FirstName)
@Html.HiddenFor(m => m[i].LastName)
@Html.HiddenFor(m => m[i].EmailAddress)
<div>
<div class="colFull">@Html.DisplayFor(m => m[i].FirstName)</div>
<div class="colFull">@Html.DisplayFor(m => m[i].LastName)</div>
<div class="colFull">@Html.DisplayFor(m => m[i].EmailAddress)</div>
<div class="colPartial">@Html.CheckBoxFor(m => m[i].IsApproved)</div>
<div class="clear"></div>
</div>
}
那应该没有任何其他代码的模型绑定(bind):)
编辑:抱歉我忘了,默认情况下 displayFors 不会为模型绑定(bind)设置正确的属性,为其他没有 editorFor 的字段添加了 hiddenFors
Edit2:根据您在评论中提出的其他问题,如果它是面向公众的并且您不希望他们使用开发工具更改任何隐藏的值,请尝试以下操作:
好的,所以您不希望他们更改 hiddenFors,这很好,但是您需要某种 ID,以便在发布数据时知道哪个客户端是哪个客户端,我建议不要在上面使用这些代码:
@Html.HiddenFor(m => m[i].FirstName)
@Html.HiddenFor(m => m[i].LastName)
@Html.HiddenFor(m => m[i].EmailAddress)
将它们替换为:
@Html.HiddenFor(m => m[i].ClientId)
这样您就不会发回名字、姓氏或电子邮件地址,而只是对已勾选或未勾选的实际客户的引用。
要回答关于跟踪原始值的评论中的其他问题,在您的 Controller 方法中,您可以直接从数据库中获取原始值,然后您可以通过以下方式检测哪些不同,类似于:
[HttpPost]
public ActionResult Administration(List<AdministrationModel> model)
{
var originalMatches = GetAllUsersInfo();
var differences = (from o in originalMatches
join c in model on o.ClientId equals c.ClientId
where c.IsApproved != o.IsApproved).ToList()
return View();
}
关于c# - MVC4 复杂类型模型在发布后为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10218209/