Допустим есть клиент и контакт этого клиента.
На странице редактирования клиента имеем блок с контактной информацией(Фио, телефон, эл. почта).
Возможно ли без веб-сокета или ajax/fetch исхитрится и изменить/добавить контакт без потери/перезагруки данных о клиенте? или все же проще поднимать сокет и начинать фигачить на js?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Редактирование подчиненной сущности на одной странице
AA> Допустим есть клиент и контакт ...
Клиент к чему? Серверной части приложения? Сторонней системе? Локальной IndexedDB? Коллекции в памяти?
AA> Возможно ли без веб-сокета или ajax/fetch исхитрится и изменить/добавить контакт
Если первичное хранилище данных не локальное (e.g. IndexedDb), то, очевидно, что нет.
Так или иначе придется делать сетевой запрос на сохранение.
AA>На странице редактирования клиента имеем блок с контактной информацией...
Что это за страница, кто/как ее генерит?
Это .NET Core View/Page (Razor) или часть SPA-приложения (React/Vue/Angular)?
Если первое — то не проблема добавить на страницу разметку для нового элемента (e.g. ContactDetails[i]), дефолтный ModelBinder умеет биндить массивы.
Если второе, то еще проще. Меняется ViewModel, UI проапдейтится автоматом.
Но опять же, если источник данных — серверная часть, то без сетевого запроса не обойтись.
Re: Редактирование подчиненной сущности на одной странице
Здравствуйте, varenikAA, Вы писали:
AA>Допустим есть клиент и контакт этого клиента. AA>На странице редактирования клиента имеем блок с контактной информацией(Фио, телефон, эл. почта). AA>Возможно ли без веб-сокета или ajax/fetch исхитрится и изменить/добавить контакт без потери/перезагруки данных о клиенте? или все же проще поднимать сокет и начинать фигачить на js?
Делай либо:
1. Как в учебниках с переходом на другой шаг с переходом на другую страницу приправив это html, css и js
либо
2. Либо делай с помощью ajax + js частичным обновлением страниц с меньшим кол-вом переходов от web-страницы к странице
Re[2]: Редактирование подчиненной сущности на одной странице
Здравствуйте, RushDevion, Вы писали:
AA>>На странице редактирования клиента имеем блок с контактной информацией... RD>Что это за страница, кто/как ее генерит? RD>Это .NET Core View/Page (Razor) или часть SPA-приложения (React/Vue/Angular)? RD>Если первое — то не проблема добавить на страницу разметку для нового элемента (e.g. ContactDetails[i]), дефолтный ModelBinder умеет биндить массивы. RD>Если второе, то еще проще. Меняется ViewModel, UI проапдейтится автоматом. RD>Но опять же, если источник данных — серверная часть, то без сетевого запроса не обойтись.
.NET Core View/Page (Razor), база sqlserver на сервере, если отправить запрос на сохранение
подчиненной сущности, то изменения полей основной сущности сбросятся. В случае, если захочется добавлять данные, а не изменять, без клиентской логики не обоитись видимо, а хотелось.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Редактирование подчиненной сущности на одной странице
Здравствуйте, Egorio, Вы писали:
E>Здравствуйте, varenikAA, Вы писали:
AA>>Допустим есть клиент и контакт этого клиента. AA>>На странице редактирования клиента имеем блок с контактной информацией(Фио, телефон, эл. почта). AA>>Возможно ли без веб-сокета или ajax/fetch исхитрится и изменить/добавить контакт без потери/перезагруки данных о клиенте? или все же проще поднимать сокет и начинать фигачить на js?
E>Делай либо:
E> 1. Как в учебниках с переходом на другой шаг с переходом на другую страницу приправив это html, css и js
В этом случае конечно все просто, но как-то неказисто, чтобы что-то отредактировать придется путешествовать от перифирии зависимостей к центру. Хотя есть опыт grails, там все подчиненные так и делались, нужна запись — идешь в справочник — добавляешь/меняешь. Потом редактируешь родительскую. Зато без клиентского кода на js.
E>либо E> 2. Либо делай с помощью ajax + js частичным обновлением страниц с меньшим кол-вом переходов от web-страницы к странице
Этот вариант смущает необходимостью переходить на js, пробовал блазор, но там кажись больше сложностей чем плюшек, что в серверном, что в клиентском.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Редактирование подчиненной сущности на одной странице
AA>.NET Core View/Page (Razor), база sqlserver на сервере, если отправить запрос на сохранение AA>подчиненной сущности, то изменения полей основной сущности сбросятся.
Во-первых, нужно сделать так, чтобы при сохранении изменений (неважно родительской или дочерней сущности)на сервер улетали все данные формы (и родительское, и дочернее).
Это нужно, чтобы на сервере всегда можно было воссоздать текущее состояние формы редактирования.
Далее, на серверной стороне вариантов как минимум 2
1. Трактовать сложный объект как Aggregate root (в терминах DDD).
Тогда с точки зрения загрузки/сохранения в персистентное хранилище родительская+дочерние сущности рассматриваются как одно целое.
Т.е. на сервер прилетели новые данные, мы поднимаем объект (родитель + все дочерние из хранилища), применяем изменения и сохраняем (родитель+все дочерние) обратно в хранилище.
При этом самый простой (но не всегда применимый) вариант для коллекции дочерних сущностей — удалить из коллекции все старое и заполнить с нуля.
2. Сохранять дочерние сущности индивидуально.
Тут нужно различать, к какой именно сущности относится данный пост формы.
Это можно сделать по имени кнопки, инициировавшей post формы, например:
// Форма
<form asp-controller="..." asp-action="..."method="post"/>
<input asp-for="ParentProperty1">
<input asp-for="ParentProperty2">
<button name="button"value="parent">Save Parent</button>
@for (var i=0; i<Model.Children>length; i++)
{
<input type="text" asp-for="@Model.Children[i].Property1"/>
<button name="button"value="save-child-@Model.Children[i].Id">Save Child</button>
<button name="button"value="delete-child-@Model.Children[i].Id">Delete Child</button>
}
</form>
// Контроллерpublic IActionResult Save(InputModel input, string button) {
if (button == "parent") {
// TODO: Update parentreturn View(input.ToViewModel());
}
if (button.Contains("save-child-")) {
// TODO: Parse child id from button name, update childreturn View(input.ToViewModel());
}
if (button.Contains("delete-child-")) {
// TODO: Parse child id from button name, delete childreturn View(input.ToViewModel());
}
if (button == "new") {
var vm = input.ToViewModel();
vm.Children.Add(new Child() {});
return View(vm);
}
}
Re[4]: Редактирование подчиненной сущности на одной странице
Здравствуйте, RushDevion, Вы писали:
RD>Во-первых, нужно сделать так, чтобы при сохранении изменений (неважно родительской или дочерней сущности)на сервер улетали все данные формы (и родительское, и дочернее). RD>Это нужно, чтобы на сервере всегда можно было воссоздать текущее состояние формы редактирования.
да, логично.
RD>Далее, на серверной стороне вариантов как минимум 2
RD>1. Трактовать сложный объект как Aggregate root (в терминах DDD). RD>Тогда с точки зрения загрузки/сохранения в персистентное хранилище родительская+дочерние сущности рассматриваются как одно целое. RD>Т.е. на сервер прилетели новые данные, мы поднимаем объект (родитель + все дочерние из хранилища), применяем изменения и сохраняем (родитель+все дочерние) обратно в хранилище. RD>При этом самый простой (но не всегда применимый) вариант для коллекции дочерних сущностей — удалить из коллекции все старое и заполнить с нуля.
точно! если изменения(id>0), то просто сохраняем, если <input type="hidden" name="add" value="1"> тогда
делаем вставку. js по минимуму, сокет не нужен. простые посты.
RD>2. Сохранять дочерние сущности индивидуально. RD>Тут нужно различать, к какой именно сущности относится данный пост формы. RD>Это можно сделать по имени кнопки, инициировавшей post формы, например: RD>
В этом варианте есть нюанс, пользователь изменил поле в родительской, потом стал редактировать дочернюю сущность, пост запрос перезагрузит страницу измененное поле родительской сущности сбросится(не сохранится).
первый вариант мне кажется более правильным, по сабмиту сохранять все изменения в одной транзакции.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Редактирование подчиненной сущности на одной странице
AA>В этом варианте есть нюанс, пользователь изменил поле в родительской, потом стал редактировать дочернюю сущность, пост запрос перезагрузит страницу измененное поле родительской сущности сбросится(не сохранится). AA>первый вариант мне кажется более правильным, по сабмиту сохранять все изменения в одной транзакции.
С чего бы ему сброситься?
Форма постится целиком, т.е. на сервер улетитит все, что в данный момент вбито в форму (и дочернее, и родительское).
Соответственно, состояние формы всегда можно восстановить.