Редактирование подчиненной сущности на одной странице
От: varenikAA  
Дата: 22.04.20 05:54
Оценка:
Допустим есть клиент и контакт этого клиента.
На странице редактирования клиента имеем блок с контактной информацией(Фио, телефон, эл. почта).
Возможно ли без веб-сокета или ajax/fetch исхитрится и изменить/добавить контакт без потери/перезагруки данных о клиенте? или все же проще поднимать сокет и начинать фигачить на js?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Редактирование подчиненной сущности на одной странице
От: RushDevion Россия  
Дата: 22.04.20 10:21
Оценка:
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: Редактирование подчиненной сущности на одной странице
От: Egorio Россия  
Дата: 22.04.20 14:36
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Допустим есть клиент и контакт этого клиента.

AA>На странице редактирования клиента имеем блок с контактной информацией(Фио, телефон, эл. почта).
AA>Возможно ли без веб-сокета или ajax/fetch исхитрится и изменить/добавить контакт без потери/перезагруки данных о клиенте? или все же проще поднимать сокет и начинать фигачить на js?

Делай либо:

1. Как в учебниках с переходом на другой шаг с переходом на другую страницу приправив это html, css и js

либо
2. Либо делай с помощью ajax + js частичным обновлением страниц с меньшим кол-вом переходов от web-страницы к странице
Re[2]: Редактирование подчиненной сущности на одной странице
От: varenikAA  
Дата: 22.04.20 23:52
Оценка:
Здравствуйте, 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]: Редактирование подчиненной сущности на одной странице
От: varenikAA  
Дата: 23.04.20 00:02
Оценка:
Здравствуйте, 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]: Редактирование подчиненной сущности на одной странице
От: RushDevion Россия  
Дата: 24.04.20 08:13
Оценка: 9 (1) +1
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 parent
    return View(input.ToViewModel());
  }
  if (button.Contains("save-child-")) {
    // TODO: Parse child id from button name, update child
    return View(input.ToViewModel());
  }
  if (button.Contains("delete-child-")) {
    // TODO: Parse child id from button name, delete child
    return View(input.ToViewModel());
  }
  if (button == "new") {
    var vm = input.ToViewModel();
    vm.Children.Add(new Child() {});
    return View(vm);
  }
}
Re[4]: Редактирование подчиненной сущности на одной странице
От: varenikAA  
Дата: 24.04.20 08:46
Оценка:
Здравствуйте, 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>
RD>// Форма
RD><form asp-controller="..." asp-action="..." method="post"/>
RD>   <input asp-for="ParentProperty1">
RD>   <input asp-for="ParentProperty2">
RD>   <button name="button" value="parent">Save Parent</button>
RD>   @for (var i=0; i<Model.Children>length; i++)
RD>   {
RD>      <input type="text" asp-for="@Model.Children[i].Property1"/>
RD>      <button name="button" value="save-child-@Model.Children[i].Id">Save Child</button>
RD>      <button name="button" value="delete-child-@Model.Children[i].Id">Delete Child</button>
RD>   }
RD></form>

RD>// Контроллер
RD>public IActionResult Save(InputModel input, string button) {
RD>  if (button == "parent") {
RD>    // TODO: Update parent
RD>    return View(input.ToViewModel());
RD>  }
RD>  if (button.Contains("save-child-")) {
RD>    // TODO: Parse child id from button name, update child
RD>    return View(input.ToViewModel());
RD>  }
RD>  if (button.Contains("delete-child-")) {
RD>    // TODO: Parse child id from button name, delete child
RD>    return View(input.ToViewModel());
RD>  }
RD>  if (button == "new") {
RD>    var vm = input.ToViewModel();
RD>    vm.Children.Add(new Child() {});
RD>    return View(vm);
RD>  }
RD>}
RD>


В этом варианте есть нюанс, пользователь изменил поле в родительской, потом стал редактировать дочернюю сущность, пост запрос перезагрузит страницу измененное поле родительской сущности сбросится(не сохранится).
первый вариант мне кажется более правильным, по сабмиту сохранять все изменения в одной транзакции.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Редактирование подчиненной сущности на одной странице
От: RushDevion Россия  
Дата: 24.04.20 08:52
Оценка:
AA>В этом варианте есть нюанс, пользователь изменил поле в родительской, потом стал редактировать дочернюю сущность, пост запрос перезагрузит страницу измененное поле родительской сущности сбросится(не сохранится).
AA>первый вариант мне кажется более правильным, по сабмиту сохранять все изменения в одной транзакции.

С чего бы ему сброситься?
Форма постится целиком, т.е. на сервер улетитит все, что в данный момент вбито в форму (и дочернее, и родительское).
Соответственно, состояние формы всегда можно восстановить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.