Когда я пытаюсь вывести таблицу с оператором foreach, она выводит 2 ошибки, говорящие о том, что MovieViewModel и MovieVM не существуют.
Это часть файла Index.cshtml:
@foreach (MovieViewModel item in MovieVM)
{
<tr>
<td>@item.MovieName</td>
<td>@item.MovieCategory</td>
<td>@item.MovieYear
<td>@item.MoviePrice</td>
</tr>
}
</table>
Это часть файла MoviesController.cs:
List<MovieViewModel> MovieVM = new List<MovieViewModel>
{
new MovieViewModel {
MovieID = movie.MovieID,
MovieName = movie.MovieName,
MovieDescription = movie.MovieDescription,
MoviePrice = movie.MoviePrice,
MovieCategory = movie.MovieCategory,
MovieYear = movie.MovieYear
},
};
return View(MovieVM);
}
Он выводит эти 2 ошибки о foreach
:
"The type or namespace 'EmployeeViewModel' does not exist in the namespace 'WebApplication3.Models '(are you missing an assembly reference?)"
а также
"The name 'MovieVM' does not exist in the current context"
Что касается другой ошибки, код, который вы показали, нигде не упоминает EmployeeViewModel
, поэтому проблема должна исходить из чего-то, что вы не показали. Ошибка должна была сообщить вам номер строки, в которой она произошла. В любом случае, похоже, что вы, возможно, пропустили утверждение using
в своем представлении. Либо так, либо вы сделали опечатку и сослались на неправильный класс
Вы можете добавить отсутствующие пространства имен в web.config
внутри папки представлений <add namespace="Example.ViewModels" />
Я также не могу понять, как вы получаете EmployeeViewModel
не существует. Если у вас нет ссылки на это в вашем представлении или, как сказал @ADyson, он сделал опечатку
Я изменил MovieVM на Model, и эта ошибка исчезла, но другая до сих пор не исправлена. он продолжает говорить, что отсутствует ссылка. Это какой-то оператор использования, который вызывает у меня эту ошибку?
Мы не знаем наверняка, потому что вы не показали нам код, в котором пытаетесь использовать EmployeeViewModel
. Вы только что показали нам код, который вместо этого говорит о MovieViewModel
. Мы также не знаем, где вы объявили класс EmployeeViewModel
(то есть, каково его пространство имен, в какой сборке он находится и существует ли он вообще).
Извините, я забыл изменить имя, EmployeeViewModel было старым именем файла и класса. Этот файл теперь называется MovieViewModel. В этом файле у меня есть только класс «MovieViewModel» с несколькими публичными get/set.
Вы должны определить тип модели в виде.
@model IEnumerable<MovieViewModel>
@foreach (var item in Model)
{
<tr>
<td>@item.MovieName</td>
<td>@item.MovieCategory</td>
<td>@item.MovieYear</td>
<td>@item.MoviePrice</td>
</tr>
}
образец: https://dotnetfiddle.net/GA0yHD
Мой код очень похож на ваш, разница только в том, что в контроллере я получаю данные из базы данных, это не кастомно. Есть ли что-то, что я должен изменить, чтобы быть данными базы данных? Может каталог или еще что?
Привет @DiogoTeixeira. Реальная разница в представлении. Я объявляю IEnumerable<MovieViewModel>
как @model
и делаю foreach для Model
not MovieVM
(имя вашей переменной). Представление не знает переменных, объявленных в контроллере.
Я уже пробовал это много раз, и появляется одна и та же ошибка, у меня есть IEnumerable @model, и у меня есть элемент var в модели, но он все равно выводит только 1 запись.
@DiogoTeixeira Сколько записей возвращает база данных? в примере видно, как рендерятся все записи dotnetfiddle.net/GA0yHD. Теперь покажите 1 запись, а не предыдущую ошибку
обновление, я пытался создать представление сведений, и когда я пытался написать @model, он отображался только в классе, разве он не должен отображаться в модели?
у меня есть в настоящее время 3 записи в базе данных, просто для проверки
@DiogoTeixeira В подробном представлении вы должны показывать только модель @model MovieViewModel
. Я не понимаю, что вы имеете в виду под классом, а не моделью. Модель - это класс
простите, я просто так запутался. Я сделал все, что вы сказали мне, и то, что сказали люди выше, и это не работает, и я не вижу для этого никаких причин.
@DiogoTeixeira Вы возвращаете только 1 запись. SingleOrDefault
вернуть 1 запись или ноль, если условие не выполнено.
Подожди, только не говори мне, что проблема в этом... я так злюсь. Тогда что мне поставить вместо SingleOrDefault?
@DiogoTeixeira вы фильтруете по идентификатору. Если с базой данных все в порядке, может существовать только запись
ооо, тогда что мне сделать, чтобы он выводил все записи базы данных?
Привет @DiogoTeixeira. Если вам нужны все записи db.MoviesData.ToList()
, а затем сопоставьте результат со списком MovieViewModel с помощью foreach или используйте Nuget AutoMapper.
Имеет ли это соединение с БД какое-либо отношение к ошибке?
public ActionResult Index()
{
PAPEntities db = new PAPEntities();
MoviesData movie = db.MoviesData.SingleOrDefault(x => x.MovieID == 1);
List<MovieViewModels> MovieVM = new List<MovieViewModels>
{
new MovieViewModels {
MovieID = movie.MovieID,
MovieName = movie.MovieName,
MovieDescription = movie.MovieDescription,
MoviePrice = movie.MoviePrice,
MovieCategory = movie.MovieCategory,
MovieYear = movie.MovieYear
},
};
return View(MovieVM);
}
}
MovieViewModel item in MovieVM
смысла нет. MovieVM был объявлен в вашем методе действия, а не в представлении. Это разные контексты. Я думаю, вы, вероятно, хотите получить доступ к модели? В этом случае используйтеMovieViewModel item in Model