Tôi đã bị kẹt một thời gian dài để chỉnh sửa một phần con của mô hình của tôi, bộ sưu tập của mô hình đã đến null.Asp: net MVC 3: @ Html.EditorFor một subcollection của mô hình của tôi trong một mẫu?
cuối cùng tôi đã tìm thấy một giải pháp, nhưng tôi thấy nó một chút bẩn:
Đầu tiên thử nghiệm của tôi dữ liệu ngay:
đối tượng Mẫu:
public class ContainerObject
{
public String Title { get; set; }
public List<ContainedObject> ObjectList { get; set; }
}
Sub đối tượng bộ sưu tập:
public class ContainedObject
{
public int Id { get; set; }
public String Text { get; set; }
public Boolean IsSelected { get; set; }
}
điều khiển phương pháp mà tạo ra các đối tượng
public ActionResult TestForm()
{
return View(new ContainerObject()
{
Title = "This is a sample title",
ObjectList = new List<ContainedObject>()
{
new ContainedObject(){Id=1, IsSelected = true, Text="ObjectOne"},
new ContainedObject(){Id=2, IsSelected = false, Text="ObjectTwo"},
new ContainedObject(){Id=3, IsSelected = true, Text="ObjectThree"},
new ContainedObject(){Id=4, IsSelected = false, Text="ObjectFour"},
}
});
}
điều khiển mà nhận đối tượng sửa
[HttpPost]
public ActionResult TestFormResult(ContainerObject filledObject)
{
return View();
}
Quan điểm
@model WebTestApplication.Models.ContainerObject
@{
ViewBag.Title = "TestForm";
}
@using (Html.BeginForm("TestFormResult","Home", FormMethod.Post)){
@Html.EditorFor(x => x.Title)
Html.RenderPartial("ContainedObject", Model.ObjectList);
<input type="submit" value="Submit"/>
}
Các phần v iew (ContainedObject.cshtml)
@model IEnumerable<WebTestApplication.Models.ContainedObject>
@{
ViewBag.Title = "ContainedObject";
int i = 0;
}
@foreach (WebTestApplication.Models.ContainedObject currentObject in Model)
{
<br />
@Html.Label(currentObject.Text);
@Html.CheckBox("ObjectList[" + i + "].IsSelected", currentObject.IsSelected);
@Html.Hidden("ObjectList[" + i + "].Id", currentObject.Id);
@Html.Hidden("ObjectList[" + i + "].Text", currentObject.Text);
i++;
}
này được thực sự làm việc, nhưng tôi đã có một vấn đề:
- Tôi đã tạo ra tên mình và xác định tài sản của đối tượng chứa
Tôi cố gắng sử dụng Html.EditorFor
thay vì Html.RenderPartial
trong chế độ xem, sự cố là nó tạo cho tôi tên "ObjectList. [0] .Id" (có thêm. giữa tên thuộc tính và người truy cập).
Tôi cũng đã cố gắng chỉ sử dụng @ Html.EditorFor ở chế độ xem một phần, nhưng nó tạo ra các vars với tên của đối tượng.
Nếu tôi không sử dụng bất kỳ mẫu nào, nó hoạt động:
@model WebTestApplication.Models.ContainerObject
@{
ViewBag.Title = "TestForm";
}
@using (Html.BeginForm("TestFormResult", "Home", FormMethod.Post))
{
@Html.EditorFor(x => x.Title)
for (int i = 0; i < Model.ObjectList.Count; i++)
{
<br />
@Html.Label(Model.ObjectList[i].Text);
@Html.CheckBoxFor(m => Model.ObjectList[i].IsSelected);
@Html.HiddenFor(m => Model.ObjectList[i].Id);
@Html.HiddenFor(m => Model.ObjectList[i].Text);
}
<br /><input type="submit" value="Submit"/>
}
Nhưng ở đây đó là một mẫu đơn giản, nhưng trong trường hợp thật của tôi, tôi sẽ có nhiều dữ liệu hơn, và điều này sẽ được tái sử dụng nhiều lần. Vì vậy, lựa chọn tốt nhất của tôi là gì?
tuyệt vời! Tôi không biết rằng trình soạn thảoCho hoặc DisplayFor sẽ tự động lặp lại nếu đó là danh sách! Có cách nào để làm cho nó hoạt động khi chỉ định mẫu nó phải sử dụng? – J4N
Bởi vì trong thực tế tôi đã nhiều lần một số thông tin có thể được hiển thị với hộp kiểm (nhiều lựa chọn) hoặc với nút radio (chọn một mục), trong cùng một bộ điều khiển (ví dụ như giá trị đã chọn và giá trị mặc định) – J4N
Bạn muốn chỉ định các mẫu khác nhau? Nếu vậy, có quá tải cho EditorFor chấp nhận tên mẫu. –