在ViewBag中填充匿名类型导致模型绑定器问题

时间:2011-04-13 12:52:12

标签: 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
}

我收到错误消息'object'不包含'Something'的定义。如果我只放@item,我会得到结果{ Something = SomeUserName }

感谢您的帮助。

2 个答案:

答案 0 :(得分:17)

这不可能。 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 :(得分:0)

如果要发送ViewData例如,并且不想发送模型 您可以使用与上部答案相同的方法 并在控制器中

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
}