0

私が遭遇した問題は、AssignedUsers プロパティが (GET Edit を終了する前に) コンストラクターで初期化されているにもかかわらず、フォームを送信した後、POST Edit アクションで null として返されることです。他のすべてのプロパティは、その状態を保持します。

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);
    }
4

1 に答える 1

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())

または、これを行うことができます

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();
    }
于 2013-07-19T14:23:31.003 に答える