【问题标题】:Razor looping through Viewbag and bind to itRazor 循环通过 Viewbag 并绑定到它
【发布时间】:2014-10-11 18:42:19
【问题描述】:

我有来自控制器的对象列表。

看起来像这样

{ Driver = System.Data.Entity.Driver_Driver1, Statuss = NotConfirmed }
{ Driver = System.Data.Entity.Driver_Driver2, Statuss = NotConfirmed }

请注意 Driver 是一个复杂类型的对象。

控制器:

var Drivers = _db.Drivers.Where(x => x.DriverCompanyID == id).Where(d => d.CanWorkIn.Where(f => f.CompanyToDriveFor.CompanyID == OwnCompany.CompanyID).Any())
                    .Select(x => new
                    {
                        Driver = x,
                        Statuss = x.CanWorkIn.FirstOrDefault().Status.ToString()

                    }).ToList();

ViewBag.ListOfDrivers = Drivers;
return PartialView("_DriverList");

我的模特

   public class DriverViewItem 
    {
        public Driver Driver { get; set; }
        public string Statuss { get; set; }
    }

我的观点

@model List<MyApp.web.Models.DriverViewItem>

这最后一点不起作用。 模型声明。

【问题讨论】:

  • 您能否更准确地说明您是如何将代码添加到 ViewBag 中的?
  • 您应该使用模型将复杂数据解析为视图
  • 我有 Linq 查询。 .Select(x =&gt; new { Driver = x, Statuss = x.CanWorkIn.FirstOrDefault().Status }).ToList();
  • 你应该看看强类型匿名类型并将列表解析为从控制器到视图的模型
  • @AshleyMedway 那么将匿名对象发送到视图有什么问题,你怎么知道OP 没有在另一个模型中使用强类型视图?

标签: c# asp.net viewbag


【解决方案1】:

首先使用您需要的属性创建一个强类型类。我打电话给我的DriverViewItem

然后在您的控制器中更改选择以选择此DriverViewItem 并将列表解析为视图的模型。

var Drivers = _db.Drivers.Where(x => x.DriverCompanyID == id).Where(d => d.CanWorkIn.Where(f => f.CompanyToDriveFor.CompanyID == OwnCompany.CompanyID).Any())
            .Select(x => new DriverViewItem()
            {
                Driver = x,
                Statuss = x.CanWorkIn.FirstOrDefault().Status

            }).ToList();

return PartialView("_DriverList", Drivers);

在视图中,您需要告诉视图期望您的模型可以这样做:

@model List<DriverViewItem>

然后你可以像这样遍历项目:

@foreach(DriverViewItem item in Model)
{
    <div>
        <p>@item.Driver.{what ever property}</p>
        <p>@item.Statuss</p>
    </div>
}

这比使用 ViewBag 解析数据更简洁。

【讨论】:

  • 我试过这样,所以可能是我弄错了模型,public class DriverViewItem { public Driver Driver { get; set; } public string Status { get; set; } }
  • @user3812199 这对我来说是正确的。没有看到其余的代码很难说?您的代码是否在在线源代码控制中?
  • 我在visual studio online上有它
  • 我更改了代码,在Statuss = x.CanWorkIn.FirstOrDefault().Status.ToString() 上添加了ToString,似乎无法正确获取模型,控制器和视图之间的管道不起作用。
【解决方案2】:

最好使用模型来传递这种数据。但要直接回答问题,在控制器中,将其作为项目数组分配给 viewbag

ViewBag.Data = {
    new { Driver = System.Data.Entity.Driver_Driver1, Status = NotConfirmed },
    new { Driver = System.Data.Entity.Driver_Driver2, Status = NotConfirmed }
}

在标记中:

@{
  if (ViewBag.Data != null){
     foreach (var item in ViewBag.Data) {
        //show the item in the view
     }
  }
}

【讨论】:

  • 虽然这在技术上回答了这个问题,但这不是一个好的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多