フォローアップ の質問:区切り文字列からリストプロパティを入力します
私が抱えている問題は、編集ビューのドロップダウンボックスが、BugAssignmentモデル内のAssignedUserIDプロパティに基づいて適切なアイテムを保持/選択していないことです。
モデル:
public class BugAssignment
{
public int BugAssignmentID { get; set; }
public int BugNumber { get; set; }
public int? AssignedUserID { get; set; }
public virtual User AssignedUser { get; set; }
public virtual Status Status { get; set; }
public IEnumerable<SelectListItem> Users { get; set; }
}
public class BugAssignmentList
{
public BugAssignmentList()
{
BugAssignments = new List<BugAssignment>();
}
public int BugAssignmentListID { get; set; }
public string Name { get; set; }
public List<BugAssignment> BugAssignments { get; set; }
}
編集/詳細ViewModel
public class BugAssignmentListDetailsViewModel
{
public int BugAssignmentListID { get; set; }
public string Name { get; set;}
public List<BugAssignment> BugAssignments { get; set; }
}
コントローラには次の2つの方法があります。
public ActionResult Edit(int id)
{
var balData = db.BugAssignmentLists.Include(bn => bn.BugAssignments).ToList();
//this is a reference to the bug assignment list object whose ID was passed in
BugAssignmentList bugAssignmentList = balData.Where(b => b.BugAssignmentListID == id).FirstOrDefault();
//loop through the bug assignment list and for each bug assignment
foreach (BugAssignment b in bugAssignmentList.BugAssignments)
{
//create the select list for each BugAssignment object
b.Users = users.Select(u => new SelectListItem
{
Value = u.UserID.ToString(),
Text = u.FullName,
Selected = u.UserID == b.AssignedUserID //<<THIS IS WHERE IT IS MESSING UP
});
}
BugAssignmentListDetailsViewModel detailsVM = new BugAssignmentListDetailsViewModel
{
BugAssignmentListID = id
};
if (bugAssignmentList != null)
{
detailsVM.BugAssignments = bugAssignmentList.BugAssignments;
detailsVM.Name = bugAssignmentList.Name;
}
return View(detailsVM);
}
// POST
[HttpPost]
public ActionResult Edit(BugAssignmentListDetailsViewModel viewModel)
{
var balData = db.BugAssignmentLists.Include(bn => bn.BugAssignments).ToList();
var users = db.Users.ToList();
BugAssignmentList bugAssignmentList = balData.Where(b => b.BugAssignmentListID == viewModel.BugAssignmentListID).FirstOrDefault();
bugAssignmentList.Name = viewModel.Name;
bugAssignmentList.BugAssignments = viewModel.BugAssignments;
if (ModelState.IsValid)
{
UpdateModel(bugAssignmentList, "BugAssignmentList");
db.Entry(bugAssignmentList).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(bugAssignmentList);
}
意見:
<table>
<thead>
<th>
Bug Number
</th>
<th>
Assigned User
</th>
</thead>
@for(int i=0; i<Model.BugAssignments.Count(); i++)
{
<tr>
<td style="text-align: center;">
@Html.EditorFor(modelItem => Model.BugAssignments[i].BugNumber)
</td>
<td>
@Html.DropDownListFor(modelItem => Model.BugAssignments[i].AssignedUserID, Model.BugAssignments[i].Users, "-- Select User --")
@Html.HiddenFor(modelItem => Model.BugAssignments[i].BugAssignmentID)
</td>
</tr>
}
</table>
POSTは正常に機能しています。データベースを見ると、BugAssignmentList内のBugAssignmentsコレクション内の各BugAssignmentは、編集ビューのドロップダウンボックスから適切なAssignedUserIDで更新されているため、POSTメソッドではありません。
問題はEdit(int id)にあります。何が起こっているのかは非常に奇妙です。foreachループの直前にブレークポイントを設定し、bugList.BugAssignmentsの内部を調べました。AssignedUserIDはすべて正しいですが、ループが完了した後、リストを再度確認すると、BugAssignment.UsersのすべてのSelectListItemで同じユーザーが選択されています。
これを引き起こす次のコードの何が問題になっていますか?
foreach (BugAssignment b in bugAssignmentList.BugAssignments)
{
//create the select list for each BugAssignment object
b.Users = users.Select(u => new SelectListItem
{
Value = u.UserID.ToString(),
Text = u.FullName,
Selected = u.UserID == b.AssignedUserID //<<THIS IS WHERE IT IS MESSING UP
});
}
また、補足として、インターフェイスを次のようにしたいと思います(これが、より簡単な方法がない限り、SelectListをBugAssignmentモデルに含める必要がある理由です。BugAssignmentコントローラー/ビューを作成したくありません。誰かが次のようなバグ番号にユーザーをすばやく割り当てることができるようにしたいと思います。
これは、何が起こっているかをよりよく示す別のスクリーンショットです。