Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 05.12.2016
Сообщений: 52

POST несколько моделей сразу

12.04.2017, 11:37. Показов 4306. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Хочу посоветоваться, как лучше сделать.
Суть такова: мне с View надо передать в контроллер сразу несколько моделей, чтобы потом добавить их в БД.
Пример того, что мне надо передать:
C#
1
2
3
4
...
[HttpPost]
public ActionResult Create(Parts part, List<Details> detail, Images img) {...}
...
Модели:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
public class Parts
{
   int id {get; set;}
   int categorie_id {get; set;}
   int brand_id {get; set;}
   ...
}
 
public class Details
{
   int id {get; set;}
   string name {get; set;}
   string value {get; set;}
   int part_id {get; set;}
}
 
public class Image
{
   int id {get; set;}
   byte[] image {get; set;}
   int part_id {get; set;}
}
То есть одним POST у меня добавляется 1 запись в таблицу с первичным ключе, несколько(сколько захочет пользователь) записей в таблицу с внешним ключом.
Как это лучше реализовать? Можно ли отправить несколько моделей в контроллер или лучше создать отдельную модель, которая будет объединять остальные? Если надо создавать отдельную, то как реализовать запись в БД с моими условиями, описанными выше?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.04.2017, 11:37
Ответы с готовыми решениями:

Несколько моделей
Вопрос такой: Как на одной странице можно использовать сразу несколько моделей, и возможно ли это сделать, даже обходными путями? ...

Несколько моделей в одном представлении
Здравствуйте! Только начал разбираться в ASP.NET MVC. Нужно сделать страницу, на которой будет слайдер, блок новостей и объявления. Сделал...

Несколько моделей засунуть в представление
Добрый день! Бьюсь с проблемой давно У меня есть 3 таблицы (см Рисунок) Как мне осуществить вывод данных в одну таблицу в...

21
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
12.04.2017, 12:02
Цитата Сообщение от Scantraxx Посмотреть сообщение
лучше создать отдельную модель, которая будет объединять остальные?
C#
1
2
3
4
5
6
7
8
9
Controller
 
ActionResult ОБщий_Метод_Post(Общая_Модель)
{
записываем в первую таблицу по одним полям
записываем во вторую
...
return View();
}
1
0 / 0 / 1
Регистрация: 05.12.2016
Сообщений: 52
12.04.2017, 12:06  [ТС]
Wolfdp, во вторую по полям через
C#
1
foreach(var item in model) {...}
так?
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
12.04.2017, 13:05
model єто что? Вам нужне отдельный класс, который либо будет содержать все поля, либо три нужные модели внутри.

Не по теме:

Млин, я и забыл, что порой люди сначала пытаются написать, а только потом думаю что пишут или читают про технологию...

0
0 / 0 / 1
Регистрация: 05.12.2016
Сообщений: 52
12.04.2017, 13:35  [ТС]
Wolfdp, я и пытаюсь разобраться как это реализовать. Я сделал класс, который объединяет 3 модели из первого поста:
C#
1
2
3
4
5
6
public class CreatePartViewModel : IEnumerable<Details>
{
   public Parts part {get; set;}
   public List<Details> detail {get; set;}
   public Images img {get; set;}
}
теперь в контроллере:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
[HttpPost]
public ActionResult (CreatePartViewModel model)
{
   //Добавляю по полям сначала в модель Parts
   Parts part = new Parts();
   part.name = model.part.name;
   ...
   //теперь надо добавить несколько моделей Details
   foreach(var detail in model)
   {
      //тут опять добавляю по полям для модели Details
   }
}
ну я как-то так себе это представляю, подскажите если не правильно

Добавлено через 13 минут
у меня одним POST должно добавлять: одну модель Parts, n-ное количество моделей Details
0
91 / 91 / 44
Регистрация: 20.04.2008
Сообщений: 331
12.04.2017, 15:45
Цитата Сообщение от Scantraxx Посмотреть сообщение
//Добавляю по полям сначала в модель Parts
* *Parts part = new Parts();
* *part.name = model.part.name;
это незачем, у вас же уже есть объект part в model
0
0 / 0 / 1
Регистрация: 05.12.2016
Сообщений: 52
12.04.2017, 15:57  [ТС]
off, ну мне же в разные таблицы надо добавлять записи. То есть я входящую общую модель разбиваю на другие модели, которые являются моделями таблицы, а потом уже сохраняют в бд.
C#
1
2
3
4
5
Parts part = new Parts();
part.name = model.part.name;
...
db.Parts.Add(part);
db.SaveChanges();
Но это ладно, меня другое интересует. Я по такой же аналогии могу вытянуть из входной модели другую модель и добавлю ее в бд. Но что если я хочу добавить в бд несколько записей одной модели? Надеюсь понятно объяснил
0
91 / 91 / 44
Регистрация: 20.04.2008
Сообщений: 331
12.04.2017, 16:52
в общем случае это будет выглядеть так
C#
1
2
3
4
5
6
7
db.Parts.Add(model.part);
 
foreach(var detail in model.detail)
   {
      db.Details.Add(detail);
   }
db.SaveChanges();
1
0 / 0 / 1
Регистрация: 05.12.2016
Сообщений: 52
13.04.2017, 09:28  [ТС]
Кто подскажет, как быть с клиентской стороной? Так как заранее не известно сколько будет моделей Details, я их буду добавлять динамически с помощью JQuery. Раньше, я практиковал через html-вские input'ы просто в цикле добавляя ++i для каждого нового поля. Можно ли сделать подобное с Razor? Просто подход через input подразумевает формирование JSON объекта и уже его отправку в контроллер, а я в контроллер хочу отправлять только общую модель (model), в которой есть List<details>. Можно ли такое провернуть?
C#
1
2
CreatePartModel model = new CreatePartModel();
//в model хранится - List<details> detail
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
13.04.2017, 09:37
Scantraxx, я ничего не понял из описанного выше вопроса. Но хранить JSON на клиенте с последующей передачей его на сервер - в порядке вещей.

Добавлено через 3 минуты
Вы можете воспроизвести на JavaScript классы модели представления, десериализовать в них данные полученные от сервера, поработать с ними удобным вам способом на клиенте и потом снова сериализовав в JSON отправить серверу. Я так делаю постоянно на работе. Довольно удобно.
1
0 / 0 / 1
Регистрация: 05.12.2016
Сообщений: 52
13.04.2017, 10:05  [ТС]
Usaga, то есть, если вот моя общая модель для трех других:
C#
1
2
3
4
5
public class CreatePartViewModel : IEnumerable<Details>
{
   public Parts part {get; set;}
   public List<Details> detail {get; set;}
}
и я хочу отправить ее на сервер, то есть в данной модели у меня может быть несколько объектов detail, мне принимать в контроллере все ту же
C#
1
2
//Controller
public ActionResult(CreatePartViewModel model) {...}
сформировав ее с помощью JSON?

Добавлено через 2 минуты
Usaga, если есть какой-то пример, буду очень признателен
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
13.04.2017, 10:11
Scantraxx, да.

Только не наследуйте свою модель от IEnumerable<Details> ибо ваша модель содержит коллекцию, а не является ею.

Добавлено через 4 минуты
Scantraxx, примеры для работы с JSON можно найти в сети. Из MVC можно отдавать JSON с помощью JsonResult.

Добавлено через 1 минуту
Если обмениваться JSON-ами через AJAX, можно будет обойтись и без перезагрузки страницы. Получится что-то похожее на SPA.
1
0 / 0 / 1
Регистрация: 05.12.2016
Сообщений: 52
13.04.2017, 10:12  [ТС]
Usaga, спасибо большое, буду разбираться
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
13.04.2017, 10:15
Scantraxx, разбирайтесь. А чтобы совсем жизнь малиной не казалась, посмотрите ещё данную библиотеку, но уже после того, как изучите первые две ссылки.

Я этой либой постоянно пользуюсь и всем советую. Очень удобная вещь.
0
0 / 0 / 1
Регистрация: 05.12.2016
Сообщений: 52
14.04.2017, 10:59  [ТС]
Я тут подумал, а можно ли обойтись без JSON? А просто на форме обращаться к коллекции, как-то так:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!--сначала идут поля для таблицы Parts -->
<div>
   Модель:
   @Html.EditorFor(model=>model.part.parts_model)
</div>
<div>
   Цена:
   @Html.EditorFor(model=>model.part.parts_price)
</div>
  <!--и т.д. -->
 
  <!-- теперь поля для коллекции Details-->
<div>
   @Html.TextBoxFor(model=>model.detail[1].details_name)
</div>
<div>
   @Html.TextBoxFor(model=>model.detail[1].details_value)
</div>
 
<div>
   @Html.TextBoxFor(model=>model.detail[2].details_name)
</div>
<div>
   @Html.TextBoxFor(model=>model.detail[2].details_value)
</div>
я попробовал сделать так, в таблицу Parts объект записывается, а в Details нет

контроллер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   [HttpPost]
        public ActionResult CreatePart(AddPartViewModel model)
        {
            if (ModelState.IsValid && model.part != null)
            {
                model.part.parts_brand_id = 3; //чисто для теста
                model.part.parts_category_id = 3; //чисто для теста
                _db.bs_parts.Add(model.part);
                if (model.detail != null)
                {
                    foreach (var details in model.detail)
                    {
                        details.details_part_id = 8; //для теста
                        _db.bs_details.Add(details);
                    }
                }
                _db.SaveChanges();
                return RedirectToAction("Main");
            }
            return View(model);
        }
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
14.04.2017, 11:08
Scantraxx, это ужасная жуть так делать.
0
0 / 0 / 1
Регистрация: 05.12.2016
Сообщений: 52
14.04.2017, 11:16  [ТС]
Usaga, а в чем подводные? Ведь не надо ничего сериализовать, просто берем и отправляет заполненную модель на сервер

Добавлено через 3 минуты
Я вижу возможную проблему в том, что не получится динамически добавлять поля(но это не точно):
PHP/HTML
1
@Html.TextBoxFor(model=>model.detail[n].details_name)
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
14.04.2017, 11:22
Лучший ответ Сообщение было отмечено Scantraxx как решение

Решение

Scantraxx, в том, что вы явно прописываете в коде количество записей, которое можете редактировать. И оно всё равно десериализуется при приёме на стороне сервера.

Я не настаиваю. Если бы модель имела фиксированное количество вмещаемых данных, то можно было бы всё явно прописать. Но ваша модель должна содержать списки произвольной длины. Вы это всё как собрались в разметке прописывать? Руками (или циклом) от одного до сотни (на всякий случай)?

Я про JSON упомянул в том контексте, что вы динамически свою страничку перерисовываете по мере необходимости (когда пользователь добавляет\удаляет редактируемые элементы), а потом собираете данные в JSON и кидаете серверу.

Но так бы я сделал. Для вас, похоже, это пока сложновато. Вам же можно и без JSON обойтись. Просто на каждое действие (добавить\удалить) придётся отправлять запрос и перерисовывать страницу (как в WebForms происходит). Тогда никаких сложностей. Просто не очень красиво и удобно.

Добавлено через 1 минуту
Цитата Сообщение от Scantraxx Посмотреть сообщение
Я вижу возможную проблему в том, что не получится динамически добавлять поля(но это не точно):
Используя подход перезагрузки страницы, вы можете выводить все записи в цикле, а не руками прописывать. Но на каждое телодвижение пользователя нужно будет отправлять запрос на сервер и заново перерисовывать страницу.
1
0 / 0 / 1
Регистрация: 05.12.2016
Сообщений: 52
14.04.2017, 11:32  [ТС]
Usaga, спасибо за способ, для меня и вправду тяжеловато пока с JSON, а вот по вашему способу пошуршу гуглы)
Но тогда я не понимаю, почему у меня не добавляется запись в таблицу Details?
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
14.04.2017, 11:39
Поставьте точку останова (breakpoint) на входе в метод действия и посмотрите содержимое модели, а так же как себя ведёт описанный там код.
Так же, в инструментах разработчика в браузере (F12), можно посмотреть что именно и в каком виде браузер послал на сервер.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2017, 11:39
Помогаю со студенческими работами здесь

Несколько моделей в одно представление
Подскажите пожалуйста, как исправить ошибку... Invalid object name 'dbo.FilialComments'. Описание: Необработанное исключение при...

Несколько моделей в одном представлении: возможно ли
Возможно ли (и правильно ли) отображать в представлении несколько моделей? Или сама MVC требует отображение только одной модели в...

RoR, связь моделей User и Post
Здравствуйте, нужна ваша помощь. Есть модель Post title:string decr:text status:string, модель User fName:string lName:string email:string...

MVC, несколько моделей на одной view
Всем привет! Столкнулся с такой проблемой. Делаю веб-приложение - что-то типа веб-интерфейса для бд (вывод всех записей, одной по id,...

MVVM несколько моделей в одном списке
Привет знатокам.Нужен хелп:)Надо сделать библиотеку в которой есть книги и журналы(разные сущности). Как бы мне их запихнуть в один...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru