ViewModel 'не содержит определения для' FirstName 'и не может быть найден метод расширения' FirstName ', принимающий первый аргумент типа' ViewModel '.

В основном то, что я пытаюсь сделать, - это получить некоторые данные от учителей из базы данных, а затем составить их список на мой взгляд. Однако каждый раз, когда я пытаюсь напечатать, я получаю эту ошибку

ViewModel »не содержит определения для« FirstName », и не удалось найти метод расширения« FirstName », принимающий первый аргумент типа« ViewModel ».

Вот мой код;

ViewModel

namespace Ability.Models
{
    public class ViewModel
    {
        public virtual IEnumerable<Teacher> Teachers { get; set; }
        public Teacher Teacher { get; set; }

        public virtual IEnumerable<Skill> Skills { get; set; }
        public Skill Skill { get; set; }
    }
}

Контроллер

public ActionResult Index()
        {
            string campus = Request.Params["Campus"];

            if (campus != null)
            {
                if (campus == "Alle")
                {
                    var teachers = (from t in db.Teachers
                                    select t);
                }
                else
                {
                    var teachers = (from t in db.Teachers
                                    where t.Campus == campus
                                    select t );
                }
            }
            else
            {
                var teachers = (from t in db.Teachers
                                select t);
            }

            var Model = new ViewModel
            {
                Teachers = db.Teachers.ToList(),
            };

            return View(Model);
        }

Просмотр

@model IEnumerable<Ability.Models.ViewModel>

<h2>Teachers at Thomas More</h2>


               ...


@foreach (var Teacher in Model)
    {
        <tr>
            <td>
                @Teacher.FirstName
            </td>
            <td>
                @Teacher.LastName
            </td>
            <td>
                @Teacher.Email
            </td>
            <td>
                @Teacher.Campus
            </td>
        </tr>
    }

Я не уверен, совпадает ли он, но я уже пробовал делать несколько вещей, включая изменение цикла на

@foreach (var Teacher in Model.Teachers)

Но потом я получаю аналогичную ошибку

«IEnumerable» не содержит определения для «Учителя», и не может быть найден метод расширения «Учителя», принимающий первый аргумент типа «IEnumerable».

Жду любой помощи, которую я могу получить!

3
Nicolas 2 Янв 2016 в 20:23

3 ответа

Лучший ответ

Я вижу пару вещей, которые не имеют смысла.

Прежде всего, где вы используете teachers?

Лично я считаю более разумным следующий код:

public ActionResult Index()
{

    IEnumerable<Teacher> teachers = Enumerable.Empty<Teacher>();

    string campus = Request.Params["Campus"];
    if (campus != null)
    {
        if (campus == "Alle")
        {
            teachers = (from t in db.Teachers
                        select t);
        }
        else
        {
            teachers = (from t in db.Teachers
                        where t.Campus == campus
                        select t );
        }
    }
    else
    {
        teachers = (from t in db.Teachers
                    select t);
    }

    var Model = new ViewModel
    {
        Teachers = teachers
    };

    return View(Model);
}

Во-вторых, вы должны также инициализировать другие свойства ViewModel в указанном выше методе действия.

Теперь перейдем к просмотру. Передаешь туда модель типа ViewModel. Если вы хотите повторить последовательность учителей, вы можете попробовать следующее:

@foreach (var teacher in Model.Teachers)
{
    <tr>
        <td>
            @teacher.FirstName
        </td>
        <td>
            @teacher.LastName
        </td>
        <td>
            @teacher.Email
        </td>
        <td>
            @teacher.Campus
        </td>
    </tr>
}

Все вышесказанное имеет смысл при условии, что db.Teachers является IEnumerable<Teacher>.

3
Christos 3 Янв 2016 в 01:07

Вы отправляете тип ViewModel в представление:

var Model = new ViewModel
{
    Teachers = db.Teachers.ToList(),
};

return View(Model);

Но он ожидает типа IEnumerable<Ability.Models.ViewModel>:

@model IEnumerable<Ability.Models.ViewModel>

То есть ожидается коллекция , в которой вы предоставляете объект .

Учитывая использование в представлении, кажется, что вы должны просто изменить его, чтобы ожидать один объект:

@model Ability.Models.ViewModel

Это позволит вам получить прямой доступ к собственности, которую вы ищете:

@foreach (var Teacher in Model.Teachers)

Примечание. Логика вашего контроллера выглядит некорректно. Вы условно создаете переменную teachers, но никогда не используете ее. Вместо этого вы просто материализуете всех учителей в базе данных и отправляете их всех в представление. Если вы хотите увидеть всех учителей, вы можете удалить большую часть этого кода. Если вы собираетесь видеться с конкретными учителями, вы можете использовать созданную вами переменную. Обратитесь к ответу @Christos, чтобы получить практический пример этого.

3
Community 23 Май 2017 в 12:10

Ваша модель - это список ViewModels. Вам нужно было использовать @foreach (var Teacher in Model.Teachers).

0
Neil Barnwell 3 Янв 2016 в 01:17