Редактирование садов и деталей - PullRequest
3 голосов
/ 28 июня 2011

Я читал http://www.orchardproject.net/docs/Creating-1-n-and-n-n-relations.ashx и не смог понять, если можно легко сделать основные детали редактирования, чтобы дать вам конкретный пример, я приложил скриншот из WordPress: enter image description here

Итак, пост и пост содержат набор настраиваемых полей, простое отношение 1: N, все редактируется на одной странице - вы можете добавлять / редактировать настраиваемое поле, не покидая страницы поста.
Может быть, кто-то видел подобный пример для OrchardИнтернет, или мог бы вкратце описать путь к достижению этого с помощью кода, был бы действительно полезен (я надеюсь, что не только для меня, потому что это довольно распространенный случай, я думаю).

1 Ответ

2 голосов
/ 28 июня 2011

Это должно быть возможно, хотя и не в «Орчардском» смысле.

Я не проверял ничего из нижеперечисленного, поэтому он, вероятно, полон ошибок - но, может быть, Бертран или Пшмид придут позже сегодня, чтобы исправить меня: -)

Как вы, вероятно, видели, вы можете передать модель представления в представление при создании формы содержимого в вашем драйвере редактора:

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.

Возможно, вам понадобится взломать, чтобы заставить его работать в редакторе для новых записей (например, создать элемент контента вместо создания), поскольку элемент контента (и все его части) еще не существует.

Я надеюсь, что все это имеет смысл, дайте мне знать, если у вас есть какие-либо вопросы: -)

...