Это должно быть возможно, хотя и не в «Орчардском» смысле.
Я не проверял ничего из нижеперечисленного, поэтому он, вероятно, полон ошибок - но, может быть, Бертран или Пшмид придут позже сегодня, чтобы исправить меня: -)
Как вы, вероятно, видели, вы можете передать модель представления в представление при создании формы содержимого в вашем драйвере редактора:
protected override DriverResult Editor(CatPart part, dynamic shapeHelper)
{
// Driver for our cat editor
var viewModel = new CatViewModel
{
Cats = _catService.GetCats() // Cats is IEnumerable<Cat>
};
return ContentShape("Parts_CatPart_Edit",
() => shapeHelper.EditorTemplate(
TemplateName: "Parts/CatPart",
Model: viewModel,
Prefix: Prefix
));
}
Таким образом, мы можем передать список элементов и отобразить их в нашем представлении следующим образом:
@foreach(var cat in Model.Cats)
{
<span class="cat">
<p>@cat.Name</p>
<a href="...">Delete Cat</p>
</span>
}
Проблема заключается в публикации изменений для обновления модели. Orchard предоставляет переопределение метода Editor
для обработки обратной передачи при редактировании детали, и мы можем восстановить модель представления, которую мы передали в предыдущем методе:
protected override DriverResult Editor(CatPart part, IUpdateModel updater, dynamic shapeHelper)
{
var viewModel = new CatViewModel();
if (updater.TryUpdateModel(viewModel, Prefix, null, null))
{
// Access stuff altered in the Cat view model, we can then update the CatPart with this info if needed.
}
}
Это очень хорошо работает для базовой информации, такой как строки или целые числа. Но Мне никогда не удавалось заставить его работать (и не был уверен, возможно ли это сделать) с динамическими списками, которые редактируются на стороне клиента.
Одним из способов решения этой проблемы было бы установить кнопки для элементов на N-конце отношения 1: N таким образом, чтобы они отправляли обратно в контроллер MVC. Этот контроллер может затем обновить модель и перенаправить клиента обратно в редактор, из которого они вышли, показывая обновленную версию записи. Это потребует, чтобы вы последовательно устанавливали свойство HTML ID / Name элементов, которые вы добавляете на стороне клиента, чтобы они могли быть прочитаны при выполнении запроса POST к вашему контроллеру, или создавали отдельные вложенные формы, которые передаются непосредственно контроллеру.
Таким образом, ваше мнение может стать:
@foreach(var cat in Model.Cats)
{
<form action="/My.Module/MyController/MyAction" method="POST">
<input type="hidden" name="cat-id" value="@cat.Id" />
<span class="cat">
<p>@cat.Name</p>
<input type="submit" name="delete" value="Delete Cat" />
</span>
</form>
}
<form action="/My.Module/MyController/AddItem" method="POST">
<input type="hidden" name="part-id" value="<relevant identifier>" />
<input type="submit" name="add" value="Add Cat" />
</form>
Другая возможность - создать контроллер, который может возвращать соответствующие данные в виде XML / JSON, и реализовать все это на стороне клиента с помощью Javascript.
Возможно, вам понадобится взломать, чтобы заставить его работать в редакторе для новых записей (например, создать элемент контента вместо создания), поскольку элемент контента (и все его части) еще не существует.
Я надеюсь, что все это имеет смысл, дайте мне знать, если у вас есть какие-либо вопросы: -)