#entity-framework #asp.net-mvc-3
#entity-framework #asp.net-mvc-3
Вопрос:
кто-нибудь может сказать мне, что я делаю не так? 🙂
У меня есть этот простой запрос:
var sample = from training in _db.Trainings
where training.InstructorID == 10
select new { Something = training.Instructor.UserName };
И я передаю это ViewBag.
ViewBag.Sample = sample;
Затем я хочу получить к нему доступ, на мой взгляд, следующим образом:
@foreach (var item in ViewBag.Sample) {
@item.Something
}
И я получаю сообщение об ошибке «объект» не содержит определения для «Чего-то». Если я помещу туда только @item
, я получу результат { Something = SomeUserName }
Спасибо за помощь.
Ответ №1:
Это невозможно сделать. ViewBag является динамическим, и проблема в том, что анонимный тип генерируется как внутренний. Я бы рекомендовал вам использовать модель представления:
public class Instructor
{
public string Name { get; set; }
}
и затем:
public ActionResult Index()
{
var mdoel = from training in _db.Trainings
where training.InstructorID == 10
select new Instructor {
Name = training.Instructor.UserName
};
return View(model);
}
и в представлении:
@model IEnumerable<Instructor>
@foreach (var item in ViewBag.Sample) {
@item.Something
}
Комментарии:
1. 1 — Обратите внимание, как он выбирает
new Instructor
конкретный тип, а не анонимный тип. Таким образом, он может получить доступ к информации внутри объекта.
Ответ №2:
Если вы хотите отправить, например, ViewData и не хотите отправлять в model, вы могли бы использовать то же самое, что и в верхнем ответе и в контроллере
enter code here
ViewData[Instractor] = from training in _db.Trainings
where training.InstructorID == 10
select new Instructor {
Name = training.Instructor.UserName
};
и в представлении вам нужно преобразовать это в
`IEnumerable<Instructor>`
но для этого вы должны использовать
@model IEnumerable<Instructor>
Тогда вы могли бы сделать что-то вроде этого
IEnumerable<instructors> Instructors =(IEnumerable<Instructor>)ViewData[Instractor];
затем перейдите к foreach
@foreach (var item in Instructors ) {
@item.Something
}