Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
DenKG
5 / 5 / 7
Регистрация: 23.12.2015
Сообщений: 739
1

List<Student>' does not contain a definition for 'StudentName' and no extension method

07.01.2019, 15:57. Просмотров 258. Ответов 10
Метки нет (Все метки)

Получаю такую ошибку при попытке вывода View: 'List<Student>' does not contain a definition for 'StudentName' and no extension method 'StudentName' accepting a first argument of type 'List<Student>' could be found (are you missing a using directive or an assembly reference?)
Представление:
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
@using TestProj.Models
@model List<Student>
@{
    ViewBag.Title = "Details";
}
 
<fieldset>
    <legend>Информация о студенте</legend>
 
    <div class="display-label"><b>Имя</b></div>
    <div class="display-field">
        @Html.DisplayFor(model => model.StudentName)
    </div>
 
    <div class="display-label"><b>Фамилия</b></div>
    <div class="display-field">
        @Html.DisplayFor(model => model.StudentAge)
    </div>
 
    <div class="display-label"><b>Курсы</b></div>
    <ul>
        @foreach (Book c in Model.Books)
        {
            <li>@c.BookName</li>
        }
    </ul>
 
</fieldset>
Контроллер:
C#
1
2
3
4
5
public ActionResult Index()
        {
            var s = db.Students.ToList();
            return View(s);
        }
Две модели:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Book
    {
        public int Id { get; set; }
        public string BookName { get; set; }
        public string BookAuthor { get; set; }
 
        public ICollection<Student> Students { get; set; }
 
        public Book()
        {
            Students = new List<Student>();
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Student
    {
        public int Id { get; set; }
        public string StudentName { get; set; }
        public int StudentAge { get; set; }
 
        public ICollection<Book> Books { get; set; }
 
        public Student()
        {
            Books = new List<Book>();
        }
    }
Что я делаю не так? Почему такая ошибка?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2019, 15:57
Ответы с готовыми решениями:

Ошибка: Window does not contain a definition for 'Controls' and no extension method 'Controls'
Решил заняться c#, но что-то не могу разобраться. имеется некоторое количество textBox'ов...

Чтение из файла в List<Student>
Я записал данные в файл а прочитать их обратно с файла и вывести на консоль не могу. Прикол в том...

Method referenced by ClientSocket->OnError has incompatible parameter list. Remove the reference?
По умолчанию конструктор создаёт на событие функцию:void __fastcall ClientSocketError(TObject...


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

Или воспользуйтесь поиском по форуму:
10
OwenGlendower
Супер-модератор
Эксперт .NET
10235 / 8835 / 3780
Регистрация: 17.03.2014
Сообщений: 17,771
Записей в блоге: 1
07.01.2019, 16:21 2
DenKG, откуда у списка студентов возьмется имя студента? Оно есть у конкретного студента. То есть если ты делаешь представление для вывода информации об одном студенте, то и передавай туда одного студента и тип модели укажи Student. Если нужно работать со списком студентов, то значит в представлении не хватает цикла.
0
DenKG
5 / 5 / 7
Регистрация: 23.12.2015
Сообщений: 739
07.01.2019, 16:30  [ТС] 3
OwenGlendower, а как в это же представление передать список книг?
0
OwenGlendower
Супер-модератор
Эксперт .NET
10235 / 8835 / 3780
Регистрация: 17.03.2014
Сообщений: 17,771
Записей в блоге: 1
07.01.2019, 16:35 4
DenKG, каких именно книг? Книг которые принадлежат студенту? Их нет нужды отдельно передавать т.к. у Student есть свойство Books.
0
DenKG
5 / 5 / 7
Регистрация: 23.12.2015
Сообщений: 739
07.01.2019, 16:36  [ТС] 5
OwenGlendower, а как их вывести тогда?
0
OwenGlendower
Супер-модератор
Эксперт .NET
10235 / 8835 / 3780
Регистрация: 17.03.2014
Сообщений: 17,771
Записей в блоге: 1
07.01.2019, 16:40 6
DenKG, циклом который уже есть в твоем представлении из первого сообщения. Озаглавлен "Курсы" почему-то, но это мелочи.

Добавлено через 1 минуту
Единственная ошибка в ней этот тип модели. Должен быть Student
HTML5
2
@model Student
0
DenKG
5 / 5 / 7
Регистрация: 23.12.2015
Сообщений: 739
07.01.2019, 16:55  [ТС] 7
OwenGlendower, Ну, это был пробный вариант. Мне нужно из всего этого таблицу сделать.
Я сделал так:
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
@model IEnumerable<TestProj.Models.Student>
@{
    ViewBag.Title = "Details";
}
<table class="table table-striped table-hover">
    <tr>
        <th>
            <p>Студент</p>
        </th>
        <th>
            <p>Возраст студента</p>
        </th>
        <th>
            <p>Книга</p>
        </th>
        <th>
            <p>Автор книги</p>
        </th>
        <th></th>
    </tr>
 
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.StudentName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.StudentAge)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
                @Html.ActionLink("Details", "Details", new { id = item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
            </td>
        </tr>
    }
 
</table>
Имя студента и его возраст выводятся, а вот с книгами как-то не получается
Но здесь уже не получается сделать цикл
HTML5
1
2
3
4
@foreach (Book c in Model.Books)
        {
            ...
        }
Добавлено через 11 минут
Попробовал так:
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
@foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.StudentName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.StudentAge)
            </td>
            <td>
                @foreach (var b in item.Books)
                {
                    @Html.DisplayFor(modelItem => b.BookName)
                }
            </td>
            <td>
                @foreach (var b in item.Books)
                {
                    @Html.DisplayFor(modelItem => b.BookAuthor)
                }
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
                @Html.ActionLink("Details", "Details", new { id = item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
            </td>
        </tr>
    }
Но тогда Название книги и Автор книги остаются пустыми
0
OwenGlendower
Супер-модератор
Эксперт .NET
10235 / 8835 / 3780
Регистрация: 17.03.2014
Сообщений: 17,771
Записей в блоге: 1
07.01.2019, 16:57 8
DenKG,
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
43
44
45
46
47
@model IEnumerable<TestProj.Models.Student>
@{
    ViewBag.Title = "Details";
}
<table class="table table-striped table-hover">
    <tr>
        <th>
            <p>Студент</p>
        </th>
        <th>
            <p>Возраст студента</p>
        </th>
        <th>
            <p>Книга</p>
        </th>
        <th>
            <p>Автор книги</p>
        </th>
        <th></th>
    </tr>
 
    @foreach (var student in Model)
    {
        @foreach (var book in student.Books)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => student.StudentName)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => student.StudentAge)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => book.BookName)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => book.BookAuthor)
                </td>
                <td>
                    @Html.ActionLink("Edit", "Edit", new { id = student.Id }) |
                    @Html.ActionLink("Details", "Details", new { id = student.Id }) |
                    @Html.ActionLink("Delete", "Delete", new { id = student.Id })
                </td>
            </tr>
        }
    }
</table>
0
DenKG
5 / 5 / 7
Регистрация: 23.12.2015
Сообщений: 739
07.01.2019, 16:59  [ТС] 9
OwenGlendower, так вообще всё пусто
0
OwenGlendower
Супер-модератор
Эксперт .NET
10235 / 8835 / 3780
Регистрация: 17.03.2014
Сообщений: 17,771
Записей в блоге: 1
07.01.2019, 17:17 10
DenKG, значит у студента нет книг. Это я не учел. В таком случае делаем как-то так:
Кликните здесь для просмотра всего текста
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
@model IEnumerable<TestProj.Models.Student>
@{
    ViewBag.Title = "Details";
}
<table class="table table-striped table-hover">
    <tr>
        <th>
            <p>Студент</p>
        </th>
        <th>
            <p>Возраст студента</p>
        </th>
        <th>
            <p>Книга</p>
        </th>
        <th>
            <p>Автор книги</p>
        </th>
        <th></th>
    </tr>
 
    @foreach (var student in Model)
    {
        var books = student.Books.ToArray()
        if (books.Length == 0)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => student.StudentName)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => student.StudentAge)
                </td>
                <td>-</td>
                <td>-</td>
                <td>
                    @Html.ActionLink("Edit", "Edit", new { id = student.Id }) |
                    @Html.ActionLink("Details", "Details", new { id = student.Id }) |
                    @Html.ActionLink("Delete", "Delete", new { id = student.Id })
                </td>
            </tr>
        }
        else
        {
            foreach (var book in books)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => student.StudentName)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => student.StudentAge)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => book.BookName)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => book.BookAuthor)
                    </td>
                    <td>
                        @Html.ActionLink("Edit", "Edit", new { id = student.Id }) |
                        @Html.ActionLink("Details", "Details", new { id = student.Id }) |
                        @Html.ActionLink("Delete", "Delete", new { id = student.Id })
                    </td>
                </tr>
            }
        }
    }
</table>

Код набирал на форуме поэтому там могут быть опечатки, но суть я надеюсь понятна.
0
DenKG
5 / 5 / 7
Регистрация: 23.12.2015
Сообщений: 739
07.01.2019, 17:35  [ТС] 11
OwenGlendower, но сейчас у меня в БД все студенты имею книги:
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
39
40
41
42
public class LibContext : DbContext
    {
        public LibContext()
            : base("DbConnection")
        {
 
        }
        static LibContext()
        {
            Database.SetInitializer(new LibDbInitializer());
        }
 
        public virtual DbSet<Book> Books { get; set; }
        public virtual DbSet<Student> Students { get; set; }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Student>().HasMany(c => c.Books)
                .WithMany(s => s.Students)
                .Map(t => t.MapLeftKey("StudentId")
                .MapRightKey("BookId")
                .ToTable("BooksStudents"));
        }
    }
 
    public class LibDbInitializer : DropCreateDatabaseAlways<LibContext>
    {
        protected override void Seed(LibContext db)
        {
            Student s1 = new Student { StudentName = "Денис", StudentAge = 21 };
            Student s2 = new Student { StudentName = "Александр", StudentAge = 22 };
 
            db.Students.Add(s1);
            db.Students.Add(s2);
 
            db.Books.Add(new Book { BookName = "Война и мир", BookAuthor = "Л.Н.Толстой", Students = new List<Student>() { s1, s2 } });
            db.Books.Add(new Book { BookName = "Три мушкетера", BookAuthor = "А.Дюма", Students = new List<Student>() { s2 } });
            db.Books.Add(new Book { BookName = "Идиот", BookAuthor = "Ф.М.Достоевский", Students = new List<Student>() { s1 } });
 
            db.SaveChanges();
        }
    }
Добавлено через 9 минут
OwenGlendower, но если поставить точку остановы, то видно, что почему-то ни к одному студенту не привязано ни одной книги. Почему?

Добавлено через 5 минут
OwenGlendower, понял. Нужно было указать, что свойство виртуальное. Правда, не понимаю, почему это нужно
C#
1
public virtual ICollection<Student> Students { get; set; }
0
07.01.2019, 17:35
Ответ Создать тему
Опции темы

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