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

Не удается передать модель внутри модели

04.03.2021, 21:34. Показов 3387. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Помогите, пожалуйста.

Создал сложную модель, которая, помимо полей Id и Name включает в себя ещё одну модель. Она может быть любой и назначается в зависимости от страницы, на которую переходит пользователь. То есть, поля Id и Name используются на всех страницах, а InnerModel в зависимости от страницы может иметь разное содержимое

C#
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
26
27
28
29
30
31
32
33
34
35
36
37
38
namespace Project.Models
{
    public class MainModel
    {
        public MainModel()
        {
            Id = 0;
            Name = string.Empty;
        }
 
        public MainModel(MainModel model)
        {
            Id = model.Id;
            Name = model.Name;
        }
 
        public int Id { get; set; }
        public string Name { get; set; }
    }
   
    public class MainModel<T> : where T: new()
    {
        public MainModel()
        {
            Id = 0;
            Name = string.Empty;
            InnerModel = new T();
        }
 
        public MainModel(MainModel model, T innerModel) {
            Id = model.Id;
            Name = model.Name;           
            InnerModel = innerModel;
        }
         
        public T InnerModel { get; set; }
    }
}
Возникла проблема при создании ActionLink.
Указываю вот так
C#
1
@Html.ActionLink("Перейти", "Messages", "Main", new MainModel<MessageModel>(ViewBag.MainModel, new MessageModel() { Count=5, From="Alex"}), new { @class = @ViewBag.Messages})
И в результате формируется вот такая строка
HTML5
1
<a class="" href="/Main/Messages?InnerModel=Project.Models.MessageModel&amp;Id=42&amp;Name=%D0%9E%D0%BB%D0%B5%D0%B3&amp;">Перейти</a>
При переходе по которой в контроллере я получаю модель:
C#
1
2
3
4
5
{
Id=42,
Name=Олег
InnerModel=null
}
Я создал InnerModel, передал туда данные, а их даже в сформированной ссылке нет. Подскажите, пожалуйста, в чем проблема. Может вообще подход не правильный.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.03.2021, 21:34
Ответы с готовыми решениями:

Как правильно передать заполненную модель бизнес логике модели представления
Всем привет! Есть задача передать заполненную бизнес модель на модель представления... public ActionResult EditUser(int User_id) ...

Выбор модели для анализа Модель Марковица или Модель Шарпа
Здравствуйте,какая по вашему мнению более оптимальная модель для анализа инвестиционного портфеля коммерческого банка Модель...

Не удаётся клонировать систему на диск другой модели
Здравствуйте всем! Помогите разобраться: Имеется рабочая система win7, один комп, один диск. Задача перенести данные(клонировать) с...

4
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
04.03.2021, 23:28
Проблема в глупости, которую Вы написали.

Добавлено через 4 минуты
Цитата Сообщение от Max2022 Посмотреть сообщение
оторая, помимо полей Id и Name включает в себя ещё одну модель. Она может быть любой и назначается в зависимости от страницы
Как Вы себе представляете представление (пардон за тавтологию), которое типизируется по "произвольной модели" ?

Что значит соловобразование
Цитата Сообщение от Max2022 Посмотреть сообщение
назначается в зависимости от страницы, на которую переходит пользователь
?

Т.е. у Вас метод контроллера тоже определяется "динамически", в "зависимости от страницы" и заранее не известен ни в разметке, ни в контроллере ?

Добавлено через 18 минут
Берем в качестве примера такой макет страницы.
Есть полоса с меню.
Каждый пункт меню адресует на целевую страницу.
Каждому пункту соответствует @ActionLink, в итоге транслированный в тэг HTML <a>
В каждой ссылке <a> должен быть указан Url и список параметров
Каждая ссылка должна соответствовать методу контроллера.
Каждый параметр url (HTTP) должен соответствовать входному параметру "своего" метода контроллера
Каждый метод контроллера должен что-то сделать с учетом полученных параметров, например, выбрать что-то из БД, и передать это "что-то" в "свое" представление (View) как объект - экземпляр класса Модели.
Чтобы это представление "поняло" что ему передано, оно должно быть типизировано на соответствующий класс Модели. Не на "произвольный", а именно на тот, который подготовил для него вызывающий метод контроллера.

Конечно, можно использовать один метод контроллера для разных пунктов меню. Можно из одного метода вызывать разные представления в зависимости о принятых параметров, для каждого из которых готовить посылочку из нужной модели.
Можно, в конце концов, вместо 1000 ссылок написать одну и при нажатии пункта меню JS настраивать этот единственный <a> на нужные url и списки параметров.

Можно даже мишку за шишку и Машку за ляжку. Только вопрос: а зачем ? Что Вы хотите сотворить и зачем это делаете так вычурно ?

Добавлено через 9 минут
Бывают, однако, случаи, когда в представление нужно передать данных более, чем могут вместиться в одну модель.
Тогда используют контейнеры. Типа Передача модели в View
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
05.03.2021, 08:09
Цитата Сообщение от MsGuns Посмотреть сообщение
Бывают, однако, случаи, когда в представление нужно передать данных более, чем могут вместиться в одну модель.
Вы говорите про ViewBag ?
1
0 / 0 / 0
Регистрация: 23.02.2021
Сообщений: 24
05.03.2021, 12:13  [ТС]
К примеру у меня есть два метода контролера

C#
1
2
3
4
5
6
7
8
9
10
11
[Route("FirstPage")]
        public ActionResult FirstPage(MainModel<FirstModel> model)
        {            
            return View(model);
        }
 
        [Route("SecondPage")]
        public ActionResult SecondPage(MainModel<SecondModel> model)
        {           
            return View(model);
        }
Они передают в соответствующие View разные модели, которые имеют только общие поля MainModel.
И ActionLink я создаю, зная какие модели нужно передать
C#
1
2
3
@Html.ActionLink("Перейти на первую страницу", "FirstPage", "Main", new MainModel<FirstModel>(ViewBag.MainModel, new FirstModel() { CountFirst=5, FromFirst="Alex"}), new { @class = @ViewBag.FirstPage})
 
@Html.ActionLink("Перейти на вторую страницу", "SecondPage", "Main", new MainModel<SecondModel>(ViewBag.MainModel, new SecondModel() { CountSecond=7, FromSecond="Alex2"}), new { @class = @ViewBag.SecondPage})
Вы, как я понял, предлагаете создать одну модель, в которой будут поля из MainModel, FirstModel и SecondModel.
И в зависимости от того, что мне нужно, я заполняю конкретные поля этой модели и передаю. И у меня получается большая модель с нужными заполненными полями, а все остальные пустые. Я правильно понял?

Добавлено через 1 час 54 минуты
Все, разобрался.
Заработало так, как мне надо.

Сделал классы таким образом и вызываю тот который мне нужен
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class MainModel
    { 
        public int Id { get; set; }
        public string Name { get; set; }
    } 
 
public class FirstModel : MainModel
    { 
        public int CountFirst { get; set; }
        public string NameFirst { get; set; }
    } 
 
public class SecondModel : MainModel
    { 
        public int CountSecond { get; set; }
        public string NameSecond { get; set; }
    }
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
05.03.2021, 13:09
Лучший ответ Сообщение было отмечено Max2022 как решение

Решение

Цитата Сообщение от Max2022 Посмотреть сообщение
Сделал классы таким образом и вызываю тот который мне нужен
Ну и чем эти три Ваши класса отличаются друг от друга ?
Номером страницы ?

Почему бы не пользоваться одной моделью, в которую с клиента записывать номер текущей страницы, который и передавать в разные методы контроллера NextPage, PriorPage ? При этом методы будут сами "листать", инкрементирую или декрементируя "текущий" номер ?
А также произвольный номер страницы (введенный или выбранный юзером) - в метод GetPage, который просто будет брать его "как есть".

А можно вообще написать единственный метод GetPage, куда из разных ActionLink передавать сразу нужную страницу ? Или вообще один-единственный ActionLink, для которого JS будет на клиенте определяться нужная страница.

Зачем куча моделей для передачи одного и того же набора параметров ?

А можно все это замутить аяксом, будет быстрее работать и не засорять трафик. Ведь, насколько я понял, все эти "страницы" имеют одинаковое по формату содержание (сетка, карусель или что-то вроде)

Вы пагинацию делаете ?

Добавлено через 1 минуту
Кстати, в этом случае модель-контейнер не нужна. Всего один параметр (кроме Id для выборки), можно передавать через ViewBag.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.03.2021, 13:09
Помогаю со студенческими работами здесь

Рисовать внутри модели
Здравствуйте Типовая задача - пользователь мышей красит вертексы каким-то цветом. И вот выясняется что в модели есть трудно доступные...

Модель представления (2 модели в одной форме редактирования)
Всем привет. Помогите решить проблему пожалуйста. Есть две модели. public class ARM { public int id { get; set; }...

А как сделать математическую модель трехмерной модели?
Здравствуйте. Подскажите, как сделать математическую модель трехмерной модели? Или, может, наоборот, строят трехмерную модель по...

Чем Спиральная модель отличается от инкрементальной интерационной модели?
Не могу понять, чем отличаются эти две модели: спиральная и инкрементально интерационная? Заранее спасибо

Преобразование изображения из цветовой модели RGB в модель HSL
Всем доброго времени суток! Я учусь на программиста, и мне очень нужна ваша помощь. Что нужно для преобразования изображения из...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru