По get вытаскиваем весь граф Company.BankAccount.Bank.BankId.
Меняем банк, отправляем post и ловим ошибку Bank is null.
Выходит вся модель Asp.Net MVC способна работать только с первым уровнем свойств?
Складывается ощущение, что было бы удобней работать со сложными объектами-агрегатами на стороне клиента,
гоняя между клиентом и сервером только json по SignalR.
По факту ООП не подходит для Asp.Net MVC.
Здравствуйте, varenikAA, Вы писали:
AA>Допустим есть Company -> BankAccount -> Bank.
AA>По get вытаскиваем весь граф Company.BankAccount.Bank.BankId. AA>Меняем банк, отправляем post и ловим ошибку Bank is null. AA>Выходит вся модель Asp.Net MVC способна работать только с первым уровнем свойств? AA>Складывается ощущение, что было бы удобней работать со сложными объектами-агрегатами на стороне клиента, AA>гоняя между клиентом и сервером только json по SignalR. AA>По факту ООП не подходит для Asp.Net MVC.
Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, varenikAA, Вы писали:
BE>В EF Core (вы же о нем?) есть такой метод Include
Иерархия объектов как я уже сказал Company включает BankAccount включает Bank
Привязка работает только при генерации формы после get-запроса:
public class BankAccountModel : DataPageModel
{
[BindProperty]
public Company Company { get; set; }
public List<SelectListItem> BankList { get; set; }
public void OnPost()
{
/* через <select asp-for="Company.Account.Bank.BankId"><option value="1">Sberbank</option>
привязываем клиент меняет банк
здесь ловим ошибку Bank - NRE
*/
}
}
Приходится преобразовывать красивую ООП-модель к плоской ViewModel с простыми св-вами и перегонять данные из одной формы в другую. т.е. переходим к ФП программированию.
Теперь представим, что мы не пытаемся натянуть сову на глобус. Поднимаем сигналР,
Клиент вытягивает по Id json. Все что нужно js с поддержкой websocket, на сервере автоматически из json
получаем сложную модель без дополнительных трансформаций.
Правда, требуется спец по веб-программированию. Но в целом такой подход более правильным кажется.
Здравствуйте, varenikAA, Вы писали:
AA>Приходится преобразовывать красивую ООП-модель к плоской ViewModel с простыми св-вами и перегонять данные из одной формы в другую. т.е. переходим к ФП программированию.
AA>Теперь представим, что мы не пытаемся натянуть сову на глобус. Поднимаем сигналР, AA>Клиент вытягивает по Id json. Все что нужно js с поддержкой websocket, на сервере автоматически из json AA>получаем сложную модель без дополнительных трансформаций. AA>Правда, требуется спец по веб-программированию. Но в целом такой подход более правильным кажется.
Что-то я не пойму проблему.
Да, вы можете отдать с клиента только BankID и потом отдельным update его обновить в бд.
Здравствуйте, BlackEric, Вы писали:
BE>Что-то я не пойму проблему. BE>Да, вы можете отдать с клиента только BankID и потом отдельным update его обновить в бд.
Проблема здесь в распухании кода, увеличении сложности, дублировании.
По сути каждое поле придется обновлять вручную, хотя у нас уже есть структура данных описывающая сущность.
Теперь берем БИК и вот уже у нас простая строка летит в метод обновления базы,
за ним еще куча пропертей. Тут главное не перепутать какой стринг или инт в какое поле кинуть.
Вопрос в том, что действительно ли C# помогает в создании веб приложения или только мешает.
Возможно Asp.Net MVC не лучшая технология для клиента.
Вот WinForms + ООП работал очень неплохо. В вебе такая гибкость и простота возможна лишь при использовании
вавнильного js+hmtl. В крайнем случае ClojureScript.
Здравствуйте, varenikAA, Вы писали:
AA>Допустим есть Company -> BankAccount -> Bank.
AA>По get вытаскиваем весь граф Company.BankAccount.Bank.BankId. AA>Меняем банк, отправляем post и ловим ошибку Bank is null. AA>Выходит вся модель Asp.Net MVC способна работать только с первым уровнем свойств? AA>Складывается ощущение, что было бы удобней работать со сложными объектами-агрегатами на стороне клиента, AA>гоняя между клиентом и сервером только json по SignalR. AA>По факту ООП не подходит для Asp.Net MVC.
Модель покажи.
json не надо гонять, надо передавать id сущности и поля модели в метод контроллера с которой будешь работать.
Company должно содержать Id BankAccount, а не всю BankAccount, BankAccount — BankId, а не Bank.
Пример изменения полей Bank:
var bank = db.Banks.FirstOrDefault( "условие поиска банка");
bank.field1 = "blabla";
bank.field2 = "blablabla";
db.SaveChanges();
или
db.SaSaveChangesAsync(); //если метод контроллера асинхронен
Здравствуйте, varenikAA, Вы писали: AA>Допустим есть Company -> BankAccount -> Bank. AA>По get вытаскиваем весь граф Company.BankAccount.Bank.BankId. AA>Меняем банк, отправляем post и ловим ошибку Bank is null.
Эммм... Извините моё невежество — а вы чего хотели??? Ну смотри, есть у нас счет номер 40802810064580005678, в Сбербанке, который имеет BankId=1481. И мы меняем его на альфовский BankId=1326. И у нас получается счет номер 40802810064580005678 (в котором 6458 это номер отделения сбера) в Альфе? Что за хрень?
Всё, что нас не убивает, ещё горько об этом пожалеет.