CẬP NHẬT câu trả lời của Leniency:
Chúng tôi cũng có thể tạo hai mối quan hệ một-nhiều với Mô hình tiếp cận đầu tiên. Dù bằng cách nào chúng ta không thể có mô hình ràng buộc như xảy ra trong quan hệ M2M thuần túy (không có tải trọng hoặc các bảng kết nối thuần túy - PJT).
Ngoài ra, trong bộ điều khiển (giàn giáo), chúng tôi có thể sử dụng mô hình xem cho các hoạt động CRUD theo yêu cầu. Giả sử là, chúng ta có một FloorViewModel với định nghĩa sau đây:
public class FloorViewModel
{
private Model2Container context = new Model2Container();
[Display(Name = "Student List")]
[Required(ErrorMessage = "Please select atleast one student from the list.")]
public int[] MyStudents { get; set; }
public Floor MyFloor { get; set; }
public MultiSelectList StudentsList { get; set; }
public StudentFloorJoin Join { get; set; }
}
Hành động tạo ra trong bộ điều khiển sẽ là:
//
// GET: /Floor/Create
public ActionResult Create()
{
var model = new FloorViewModel() { StudentsList = new MultiSelectList(context.Students, "Id", "Name") };
return View(model);
}
//
// POST: /Floor/Create
[HttpPost]
public ActionResult Create(FloorViewModel floor)
{
if (ModelState.IsValid)
{
context.Floors.Add(floor.MyFloor);
context.SaveChanges();
}
foreach (var student in floor.MyStudents)
{
context.StudentFloorJoins.Add(new StudentFloorJoin() { Student = context.Students.Find(student), Floor = floor.MyFloor, Room = floor.Join.Room });
}
if (ModelState.IsValid)
{
context.SaveChanges();
return RedirectToAction("Index");
}
context.Floors.Remove(floor.MyFloor);
floor.StudentsList = new MultiSelectList(context.Students, "Id", "Name", floor.MyStudents);
return View(floor);
}
và các hành động chỉnh sẽ là một cái gì đó như:
//
// GET: /Floor/Edit
public ActionResult Edit(int id)
{
Floor floor = context.Floors.Single(x => x.Id == id);
int[] ids = (from i in floor.StudentFloorJoins select i.Student.Id).ToArray();
var model = new FloorViewModel() { StudentsList = new MultiSelectList(context.Students, "Id", "Name", ids), MyFloor = floor, Join = new StudentFloorJoin() { Room = floor.StudentFloorJoins.Count == 0 ? "" : floor.StudentFloorJoins.First().Room } };
return View(model);
}
//
// POST: /Floor/Edit
[HttpPost]
public ActionResult Edit(FloorViewModel floor)
{
if (ModelState.IsValid)
{
var item = floor.MyFloor;
var itemEntry1 = context.Entry<Floor>(item);
itemEntry1.State = EntityState.Modified;
var query = (from i in context.StudentFloorJoins where i.Floor.Id == item.Id select i.Id);
foreach (var studentfloor in query)
{
context.StudentFloorJoins.Remove(context.StudentFloorJoins.Find(studentfloor));
}
context.SaveChanges();
foreach (var student in floor.MyStudents)
{
context.StudentFloorJoins.Add(new StudentFloorJoin() { Student = context.Students.Find(student), Floor = floor.MyFloor, Room = floor.Join.Room });
}
context.SaveChanges();
return RedirectToAction("Index");
}
floor.StudentsList = new MultiSelectList(context.Students, "Id", "Name", floor.MyStudents);
return View(floor);
}
Trong Xem, chúng tôi có thể gửi đối tượng của FloorModelView như:
@model ManyToManyAutoGen.Models.FloorViewModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Floor</legend>
@Html.Partial("_CreateOrEdit", Model)
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
và cuối cùng, phần _CreateOrEdit trông giống như:
@model ManyToManyAutoGen.Models.FloorViewModel
@* This partial view defines form fields that will appear when creating and editing entities *@
<div class="editor-label">
@Html.LabelFor(model => model.MyFloor.FloorName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.MyFloor.FloorName)
@Html.ValidationMessageFor(model => model.MyFloor.FloorName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.MyStudents)
</div>
<div class="editor-field">
@Html.ListBoxFor(model => model.MyStudents, Model.StudentsList)
@Html.ValidationMessageFor(model => model.MyStudents)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Join.First().Room)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Join.First().Room)
@Html.ValidationMessageFor(model => model.Join)
</div>
Cảm ơn bạn đã nhập. Vui lòng kiểm tra phần cập nhật và cho tôi biết nếu mã trong bộ điều khiển có thể được làm mỏng hơn và kiểu dáng đẹp hơn. –
Tôi đang tìm phần cập nhật với bộ điều khiển mà bạn đã đề cập ... không tìm thấy? – Leniency
Thật tệ. Có vẻ như nó đã bị từ chối bởi những người dùng khác mặc dù nó chỉ là phần tiếp theo của câu trả lời của bạn. Hãy để tôi đặt nó trong một câu trả lời riêng biệt. –