Ответ 1
Для этого вы можете использовать EditorTemplates. Вот рабочий образец.
Итак, у меня есть viewmodel для представления отношения отец-ребенок
public class PersonVM
{
public int Id { set; get; }
public string Name { set; get; }
public int? ParentId { set; get; }
public List<PersonVM> Childs { set; get; }
}
И в моем методе действий GET я создаю объект своей модели представления и загружаю в него данные Father -childs.
public ActionResult EditorTmp(int id = 1)
{
//Hard coded for demo, you may replace with actual DB values
var person = new PersonVM {Id = 1, Name = "Mike"};
person.Childs = new List<PersonVM>
{
new PersonVM {Id = 2, Name = "Scott", ParentId = 11},
new PersonVM {Id = 2, Name = "Gavin", ParentId = 12}
};
return View(person);
}
Теперь я создам EditorTemplate. Для этого перейдите в папку "Представления" и создайте каталог под названием EditorTemplates в каталоге, который имеет то же имя, что и контроллер, и добавьте представление с именем PersonVM.cshtml
Теперь перейдите к этому представлению и добавьте нижеприведенный код.
@model ReplaceWithYourNameSpaceNameHere.PersonVM
<div>
<h4>Childs </h4>
@Html.TextBoxFor(s => s.Name)
@Html.HiddenFor(s => s.Id)
</div>
Теперь вернемся к нашему основному виду. Нам нужно сделать это представление строго типизированным для нашего оригинального PersonVM
. Мы будем использовать метод EditorFor html helper в этом представлении, чтобы вызвать наш шаблон редактора
@model ReplaceWithYourNameSpaceNameHere.PersonVM
@using (Html.BeginForm())
{
<div>
@Html.TextBoxFor(s => s.Name)
@Html.HiddenFor(s => s.Id)
</div>
@Html.EditorFor(s=>s.Childs)
<input type="submit"/>
}
Теперь у нас есть метод HttpPost для управления отправкой формы
[HttpPost]
public ActionResult EditorTmp(PersonVM model)
{
int fatherId = model.Id;
foreach (var person in model.Childs)
{
var id=person.Id;
var name = person.Name;
}
// to do : Save ,then Redirect (PRG pattern)
return View(model);
}
Теперь, если вы поместите точку останова в свой метод действия HttpPost, вы можете увидеть, что Id дочерних элементов передается этому методу действий.
Важно помнить, что имя представления шаблона вашего редактора должно быть таким же, как и тип, который вы привязываете к нему.