MVC传递列表以查看问题

时间:2011-11-16 15:34:05

标签: c# asp.net-mvc

我在控制器中有一个列表如下:

    public class TruckData
    {
       public string Truck{ get; set; }                        
    }


     var truckdat = (from p in KowaDataContext.tblTrucks
                     orderby p.Truck
                     select new TruckData {Truck= p.Truck});


     var trucklist = truckdat.ToList();

     ViewBag.TrckList= trucklist;

视图如下所示:

    @foreach (Data.Rep.Controllers.TruckController.TruvckData item in ViewBag.TrckList)         
    {
     <tr>        

      <td>
         @item.Truck
      </td>
   </tr>      

   }

我的问题是,如何在不使用类的情况下将列表传递给视图:

     public class TruckData
    {
         public string Truck{ get; set; }                        
    }

以便我的列表如下所示:注意如何对TruckData的引用如下:

    var truckdat = (from p in KowaDataContext.tblTrucks
                       orderby p.Truck
                       select new {Truck= p.Truck});

     var trucklist = truckdat.ToList();

     ViewBag.TrckList= trucklist;

我不确定视图中的foreach会是什么样子。我尝试了下面显示的但是给了我一个问题。

  @foreach (var item in ViewBag.TrucksSelectList) 

1 个答案:

答案 0 :(得分:10)

不,这是不可能的。您无法将匿名对象传递给视图。原因是编译器将匿名对象作为内部发出。由于ASP.NET动态地将视图编译为单独的程序集,因此无法访问此模型。

  

我的问题是,如何在不使用类的情况下将列表传递给视图:

这将违反所有良好做法=&gt;你需要使用一个视图模型:

var truckdat = 
  from p in KowaDataContext.tblTrucks
  orderby p.Truck
  select new TruckData { Truck = p.Truck };

ViewBag.TrckList = truckdat.ToList();

然后在视图中:

@foreach (var item in (IEnumerable<TruckData>)ViewBag.TrckList) 
{
    <div>@item.Truck</div>
}

由于您有一个字符串列表,您可以将其用作模型:

var truckdat = 
  from p in KowaDataContext.tblTrucks
  orderby p.Truck
  select p.Truck;

ViewBag.TrckList = truckdat.ToList();

然后在视图中:

@foreach (var item in (IEnumerable<string>)ViewBag.TrckList) 
{
    <div>@item</div>
}

我也强烈建议你摆脱ViewBag并使用强类型视图模型:

public ActionResult Foo()
{
    IEnumerable<TruckData> model = 
        from p in KowaDataContext.tblTrucks
        orderby p.Truck
        select new TruckData { Truck = p.Truck };

    return View(model);
}

然后:

@model IEnumerable<TruckData>
@foreach (var item in Model)
{
    <div>@item.Truck</div>
}

引入TruckData类型的显示模板(~/Views/Shared/DisplayTemplates/TruckData.cshtml):

@model TruckData
<div>@Model</div>

你甚至可以在主视图中摆脱丑陋无用的foreach循环:

@model IEnumerable<TruckData>
@Html.DisplayForModel()