2013-07-19 32 views
0

我遇到的問題是,儘管AssignedUsers屬性在我的構造函數中初始化(在離開GET編輯之前),但它在POST Edit操作中返回爲空值,提交後表格。所有其他屬性保持其狀態。提交POST後MVC4模型的綁定屬性丟失

除了在ModelState.IsValid檢查後(並在返回視圖之前)重新初始化屬性之外,是否還有其他方法可以通過此檢查?

型號:

public class GroupModel { 

    public List<int> AssignedUserIds { get; set; } 

    public MultiSelectList AssignedUsers { get; set; } 

    public GroupModel(Groups group) { 
     var allUserGroups = AccountManagementAdapter.GetUserGroups(); 

     AssignedUsers = new MultiSelectList(
      allUserGroups 
      .Where(userGroup => userGroup.GroupId == Id) 
      .Select(userGroup => userGroup.Users) 
      .ToList(), 
      "Id", 
      "Username"); 

     AssignedUserIds = allUserGroups 
      .Where(userGroup => userGroup.GroupId == Id) 
      .Select(userGroup => userGroup.UserId) 
      .ToList(); 
    } 

查看:

@using (Html.BeginForm()) { 
@Html.ListBoxFor(group => group.AssignedUserIds, Model.AssignedUsers) 
<input type="submit" value="Save"/> 
} 

控制器:

[HttpGet] 
    public ActionResult Edit(int id) { 
     GroupModel groupModel = new GroupModel(AccountManagementAdapter.GetGroups().FirstOrDefault(group => group.Id == id)); 
     return View(groupModel); 
    } 

    [HttpPost] 
    public ActionResult Edit(GroupModel group) { 
     if (ModelState.IsValid) { 
      group = new GroupModel(AccountManagementAdapter.UpdateUsersForGroup(group.Id, group.AssignedUserIds)); 
      ViewBag.Success = true; 
     } 

     return View(group); 
    } 

回答

2

你不是在你的形式發佈的數據。所以它不會被返回到編輯方法。您應該這樣做的方式是,我不會建議將數據發佈到您的表單。

我會做這樣的

模式的變革:

public class GroupModel { 

    public List<int> AssignedUserIds { get; set; } 

    MultiSelectList _assignedUsers; 
    public MultiSelectList AssignedUsers() { 
     return _assignedUsers ?? _assignedUsers = new MultiSelectList(
      AllUserGroups 
      .Where(userGroup => userGroup.GroupId == Id) 
      .Select(userGroup => userGroup.Users) 
      .ToList(), 
      "Id", 
      "Username"); 
    } 
    private object _allUserGroups; /* not sure what this is */ 
    private object AllUserGroups { 
      get { return _allUserGroups ?? _allUserGroups = AccountManagementAdapter.GetUserGroups(); 
    } 

    public GroupModel(Groups group) { 
      AssignedUserIds = AllUserGroups 
       .Where(userGroup => userGroup.GroupId == Id) 
       .Select(userGroup => userGroup.UserId) 
       .ToList(); 
    } 

查看:

@Html.ListBoxFor(group => group.AssignedUserIds, Model.AssignedUsers()) 

OR你可以這樣做

public class GroupModel { 

    public List<int> AssignedUserIds { get; set; } 

    public MultiSelectList AssignedUsers { get; set; } 

    private object allUserGroups 
    public GroupModel() { 
     allUserGroups = AccountManagementAdapter.GetUserGroups(); 
     AssignedUsers = new MultiSelectList(
      allUserGroups 
      .Where(userGroup => userGroup.GroupId == Id) 
      .Select(userGroup => userGroup.Users) 
      .ToList(), 
      "Id", 
      "Username"); 
    } 
    public GroupModel(Groups group) :this() { 
     AssignedUserIds = allUserGroups 
      .Where(userGroup => userGroup.GroupId == Id) 
      .Select(userGroup => userGroup.UserId) 
      .ToList(); 
    }