Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
__War10ck__
4 / 4 / 1
Регистрация: 08.01.2014
Сообщений: 47
Завершенные тесты: 1
1

Работа с моделью представления

08.12.2016, 12:49. Просмотров 467. Ответов 12
Метки нет (Все метки)

имею модели:
C#
1
2
3
4
5
6
7
8
9
    public class Album
    {
        public int  Id { get; set; }
        public string Name { get; set; }
        public DateTime DateOfRelease { get; set; }
        public int CountOfSongs{ get; set; }
        public int SingerId { get; set; }
 
    }
C#
1
2
3
4
5
6
7
    public class Singer
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime DateOfBirth { get; set; }
 
    }
и собственно модель представления:
C#
1
2
3
4
5
6
7
8
9
10
    public class AlbumView
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime DateOfRelease { get; set; }
        public int CountOfSongs { get; set; }
        public string NameOfSinger { get; set; }//Поле из таблицы Singer, берется по ID
        public DateTime DateOfBirth { get; set; }//Поле из таблицы Singer, берется по ID
 
    }
Пишу вот такой контроллер для вывода в представление выше указанной модели
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 HomeController : Controller
    {
        AlbumDbContext DB = new AlbumDbContext();
        public ActionResult Index()
        {
            AlbumView viewEntity=new AlbumView();
            foreach (var a in DB.Albums)
            {
                viewEntity.Name=a.Name;
                viewEntity.CountOfSongs=a.CountOfSongs;
                viewEntity.DateOfRelease=a.DateOfRelease;
                viewEntity.Id=a.Id;
                var songers = DB.Songers.Find(a.SingerId);
                viewEntity.NameOfSinger=songers.Name;
                viewEntity.DateOfBirth = songers.DateOfBirth;
            }
            ViewBag.Albums = viewEntity;
            return View();
        }
 
 
        
    }
Вопрос 1: Правильно ли я делаю выборку вот тут:
C#
1
2
3
4
5
6
7
  viewEntity.Name=a.Name;
                viewEntity.CountOfSongs=a.CountOfSongs;
                viewEntity.DateOfRelease=a.DateOfRelease;
                viewEntity.Id=a.Id;
                var songers = DB.Songers.Find(a.SingerId);
                viewEntity.NameOfSinger=songers.Name;
                viewEntity.DateOfBirth = songers.DateOfBirth;
Вопрос 2: Как правильно преобразовать
C#
1
AlbumView viewEntity
в
C#
1
 IEnumerable<AlbumView>viewEntity
Вопрос 3: Как в представлении работать напрямую с моделью? или же обязательно должен быть передан объект типа
C#
1
IEnumerable<ИмяМодели>
Код представления, где вывожу на страницу данные таблиц, к сведению такой:
HTML5
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
39
40
41
42
<div>
    <h3>Альбомы</h3>
    <table>
        <tr>
            <td>
                <p>Ид альбома </p></td>
            <td>
                <p>Имя</p></td>
            <td>
                <p>Дата выхода</p></td>
            <td>
                <p>Количество песен</p>
            </td>
            <td>
                <p>Имя исполнителя</p>
            </td>
            <td>
                <p>Дата рождения певца</p>
            </td>
            <td></td>
        </tr>
        @foreach (var a in ViewBag.Albums)
        {
            <tr>
                <td>
                    <p>@a.Id</p></td>
                <td>
                    <p>@a.Name</p></td>
                <td>
                    <p>@a.DateOfRelease.ToString("yyyy/MM/dd")</p></td>
                <td>
                    <p>@a.CountOfSongs</p></td>
                <td>
                    <p>@a.NameOfSinger</p>
                </td>
                <td>
                    <p>@a.DateOfBirth.ToString("yyyy/MM/dd")</p>
                </td>
            </tr>
        }
    </table>
</div>
P.S Извиняюсь за простыню.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2016, 12:49
Ответы с готовыми решениями:

Как работать с моделью в JS
Здравствуйте! Интересует как правильно работать с моделью и ViewBag в блоке &lt;script...

Ошибка с моделью в представлении
Всем привет!Возможно глупый вопрос,но как пофиксить ошибку&quot;Object reference not set to an instance...

Как выполнить сгенерированный моделью скрипт?
Model First. Нажимаю создать базу данных из модели, создается скрипт. И я туплю, не понимая как его...

Беда с моделью в представлениях при работе с MYSQL
Здравствуйте! Возникла следующая проблема при работе с Ентити Фрейморковской моделью базы данных...

Unable to retrieve metadata for при создании контролера с моделью ELMAH_Error
Вылетает когда хочу создать контролер с моделью ELMAH_Error сгенерированную от базы, и контекст...

12
Usaga
Эксперт .NET
5785 / 4031 / 718
Регистрация: 21.01.2016
Сообщений: 15,791
Завершенные тесты: 2
08.12.2016, 13:24 2
__War10ck__, по-хорошему, на одну тему должен быть один вопрос.

Вот тут:

C#
1
2
3
4
5
6
7
8
9
10
            foreach (var a in DB.Albums)
            {
                viewEntity.Name=a.Name;
                viewEntity.CountOfSongs=a.CountOfSongs;
                viewEntity.DateOfRelease=a.DateOfRelease;
                viewEntity.Id=a.Id;
                var songers = DB.Songers.Find(a.SingerId);
                viewEntity.NameOfSinger=songers.Name;
                viewEntity.DateOfBirth = songers.DateOfBirth;
            }
... ты в цикле перезаписываешь свойства одного и того же объекта.

Для работы с коллекциями используй List<T> (гугл в помощь).

Передавать в представления можно и сами модели, напрямую, а не через ViewBag.

Рекомендую почитать об этом.
0
__War10ck__
4 / 4 / 1
Регистрация: 08.01.2014
Сообщений: 47
Завершенные тесты: 1
08.12.2016, 13:58  [ТС] 3
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
ты в цикле перезаписываешь свойства одного и того же объекта.
Нет...viewEntity-это модель представления. а- строка таблицы Albums из базы BD..
Цитата Сообщение от Usaga Посмотреть сообщение
Передавать в представления можно и сами модели, напрямую, а не через ViewBag.
Опять не по делу.
Цитата Сообщение от Usaga Посмотреть сообщение
Рекомендую почитать об этом.
Если Вы действительно считаете что viewEntity и строка таблицы одинаковые объекты, пройдите по Вашей ссылке
0
Usaga
Эксперт .NET
5785 / 4031 / 718
Регистрация: 21.01.2016
Сообщений: 15,791
Завершенные тесты: 2
08.12.2016, 14:05 4
__War10ck__, viewEntity может быть хоть самим чертом, но если ты в цикле миллион раз перепишешь его свойства, то ты получишь один объект, а не коллекцию, свойства которого содержат данные из последней итеракции цикла. Так понятней?

Добавлено через 1 минуту
Цитата Сообщение от __War10ck__ Посмотреть сообщение
Если Вы действительно считаете что viewEntity и строка таблицы одинаковые объекты, пройдите по Вашей ссылке
Вот где я такое говорил?
0
08.12.2016, 14:05
__War10ck__
4 / 4 / 1
Регистрация: 08.01.2014
Сообщений: 47
Завершенные тесты: 1
08.12.2016, 14:24  [ТС] 5
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
__War10ck__, viewEntity может быть хоть самим чертом, но если ты в цикле миллион раз перепишешь его свойства, то ты получишь один объект, а не коллекцию, свойства которого содержат данные из последней итеракции цикла. Так понятней?
Добавлено через 1 минуту
Сообщение от __War10ck__
Если Вы действительно считаете что viewEntity и строка таблицы одинаковые объекты, пройдите по Вашей ссылке
Вот где я такое говорил?
Цитата Сообщение от Usaga Посмотреть сообщение
Если Вы действительно считаете что viewEntity и строка таблицы одинаковые объекты, пройдите по Вашей ссылке
я Вас неверно понял. это я уже переделал.
Но меня мучает один вопрос "а не слишком ли много г*****кода?"
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
        AlbumDbContext DB = new AlbumDbContext();
        public ActionResult Index()
        {
            List<AlbumView> viewEntityCollection=new List<AlbumView>();
            foreach (var a in DB.Albums)
            {
                AlbumView viewEntity = new AlbumView();
                viewEntity.Name=a.Name;
                viewEntity.CountOfSongs=a.CountOfSongs;
                viewEntity.DateOfRelease=a.DateOfRelease;
                viewEntity.Id=a.Id;
                var songers = DB.Songers.Find(a.SingerId);
                viewEntity.NameOfSinger=songers.Name;
                viewEntity.DateOfBirth = songers.DateOfBirth;
                viewEntityCollection.Add(viewEntity);
            }
            ViewBag.Albums = viewEntityCollection;
           
            return View();
        }
 
 
        
    }
0
Usaga
Эксперт .NET
5785 / 4031 / 718
Регистрация: 21.01.2016
Сообщений: 15,791
Завершенные тесты: 2
08.12.2016, 14:27 6
__War10ck__, много. Можно в представление передать сущность из БД. Ничего в этом страшного нет. Или можно использовать Automapper для копирования данных из сущности в модель представления.
0
__War10ck__
4 / 4 / 1
Регистрация: 08.01.2014
Сообщений: 47
Завершенные тесты: 1
08.12.2016, 14:40  [ТС] 7
Usaga, Весь прикол лишь в том что нужно брать данные из разных таблиц...как бы Вы сделали?
0
Usaga
Эксперт .NET
5785 / 4031 / 718
Регистрация: 21.01.2016
Сообщений: 15,791
Завершенные тесты: 2
08.12.2016, 14:48 8
__War10ck__, просто: в первую очередь рассмотрел бы вопрос использования сущности в представлении. Если нет, то сделал бы модель представление и заполнил бы её данными из сущности.

Разные таблицы - не проблема. Ты можешь сделать сущность Album агрегатом. Замени SingerId на ссылку на класс Singer и, либо загрузи её явно (Include, Load) или сделай виртуальным свойством и EF подтянет Singer автоматически, когда представление обратится к данному свойству.

Получается, что в представление ты передаёшь один объект модели (или коллекцию). А в его свойствах лежат все другие, связанные с данной сущностью сущности (каламбур). Проще: несколько таблиц отображаются, в конечном итоге, на одну модель.
0
__War10ck__
4 / 4 / 1
Регистрация: 08.01.2014
Сообщений: 47
Завершенные тесты: 1
09.12.2016, 09:08  [ТС] 9
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
то сделал бы модель представление и заполнил бы её данными из сущности.
Я как бы и пытаюсь это сделать))
0
Usaga
Эксперт .NET
5785 / 4031 / 718
Регистрация: 21.01.2016
Сообщений: 15,791
Завершенные тесты: 2
09.12.2016, 09:15 10
__War10ck__, да, но ты это не совсем правильно делаешь)
0
__War10ck__
4 / 4 / 1
Регистрация: 08.01.2014
Сообщений: 47
Завершенные тесты: 1
10.01.2017, 08:57  [ТС] 11
Usaga, проблема решилась сама собой когда сделал "lazy load"
0
quizzer
180 / 58 / 7
Регистрация: 28.08.2012
Сообщений: 363
10.01.2017, 10:10 12
__War10ck__, как вариант, можно использовать метод Include. Плюс в определении данных есть проблема, данные, которые относятся к певцу, определены в классе альбома
C#
1
2
public string NameOfSinger { get; set; }//Поле из таблицы Singer, берется по ID
public DateTime DateOfBirth { get; set; }//Поле из таблицы Singer, берется по ID
Это в корне не правильно, гораздо проще хранить ссылку на певца в виде id, а с помощью Iclude или Lazy Loading подгружать связанные данные
1
__War10ck__
4 / 4 / 1
Регистрация: 08.01.2014
Сообщений: 47
Завершенные тесты: 1
10.01.2017, 12:42  [ТС] 13
Уже согласен с Вами
0
10.01.2017, 12:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2017, 12:42

Работа с моделью
Имеется такой вот кусок кода @parent_student = ParentStudent.find_by(parent_id:...

Работа с моделью User
Должно быть 4 вида пользователя: Администратор, диспетчер, юр. лицо - используют стандартную...

Работа с DOM- моделью
День добрый! Есть форма: Нужно программно нажать на кнопку &quot;Заполнено&quot;, а потом далее....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru