c# - MVC4 复杂类型模型在发布后为空

标签 c# asp.net-mvc asp.net-mvc-4 razor

这是我的模型

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/

相关文章:

c# - 如何将 SpecFlow 表转换为字符串数组

c# - Odata Asp.NET WebApi 在实体/DTO 中返回 json 属性

javascript - 添加/删除规则后如何使用 jQuery 重新验证表单?

javascript - 根据返回的数据隐藏和取消隐藏表 div

asp.net-mvc-4 - 屏幕上不显示syncfusion网格

c# - 仅在我的应用程序中添加到 shell 上下文菜单

javascript - 使浏览器无法访问 Web 服务?

javascript - 使用 Angular 谷歌地图时如何正确处理标记点击事件?

asp.net - 在不同的项目中创建数据库上下文

c# - ASP.NET WebApi - 一个 Controller 中的多个 GET 操作