如何使用 foreach 在 Razor 中设置 Viewbag 值?

How can i set Viewbag value in Razor by using foreach?

这是我的代码:

 var result = (from Photos in photos
                       join Projects in projects on Photos.ProjectID equals Projects.ProjectID
                       where
                         Projects.IsTopProject == true
                       select new
                       {
                           Projects.TaskMaster,
                           Projects.Location,
                           Photos.Photo1
                       }).ToList(); 
ViewBag.photos= result;

在 Razor 页面中,我想像这样使用 foreach:

<div class="row">
                    @foreach (var photoItem in  ViewBag.photos)
                    {
                      <img class="img-responsive" src="~/@photoItem.??Photos.Photo1" />
                     <li>@photoItem.??Projects.Location</li>
                     <li>@photoItem.??Projects.TaskMaster</li>
                    }
</div>

但我无法分配给任何 @photoItem 的 属性。

问题就在这里

 select new
            {
              Projects.TaskMaster,
              Projects.Location,
              Photos.Photo1
             }).ToList(); 

您应该创建一个视图模型(假设 PhotoViewModel),然后创建新的 PhotoViewModel

public class PhotoViewModel
{
    public int TaskMaster { get; set; }

    public string Location { get; set; }

    public string Photo1 { get; set; }
}

然后在Controller中,应该是这样的

var result = (from Photos in photos
                       join Projects in projects on Photos.ProjectID equals Projects.ProjectID
                       where
                         Projects.IsTopProject == true
                       select new PhotoViewModel
                       {
                           Projects.TaskMaster,
                           Projects.Location,
                           Photos.Photo1
                       }).ToList(); 
ViewBag.photos= result;

在视图中,应该是

@foreach (var photoItem in (List<PhotoViewModel>)ViewBag.photos)

强烈建议使用模型,但快速解决方法是将 viewbag 值拆箱为其适当的类型:

// @foreach (var photoItem in  ViewBag.photos)


@foreach (var photoItem in  ViewBag.photos as List<PhotoViewModel>)

或其他投射方式:

@foreach (var photoItem in  ( (List<PhotoViewModel>) ViewBag.photos)