Добавление анонимного типа в ViewBag вызывает проблемы с привязкой модели

#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
}