MVC传递列表以查看问题

Nat*_*Pet 2 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;
Run Code Online (Sandbox Code Playgroud)

视图如下所示:

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

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

   }
Run Code Online (Sandbox Code Playgroud)

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

     public class TruckData
    {
         public string Truck{ get; set; }                        
    }
Run Code Online (Sandbox Code Playgroud)

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

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

     var trucklist = truckdat.ToList();

     ViewBag.TrckList= trucklist;
Run Code Online (Sandbox Code Playgroud)

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

  @foreach (var item in ViewBag.TrucksSelectList) 
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 10

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

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

这将违反所有良好做法=>您需要使用视图模型:

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

ViewBag.TrckList = truckdat.ToList();
Run Code Online (Sandbox Code Playgroud)

然后在视图中:

@foreach (var item in (IEnumerable<TruckData>)ViewBag.TrckList) 
{
    <div>@item.Truck</div>
}
Run Code Online (Sandbox Code Playgroud)

因为你有一个字符串列表,你可以使用它作为模型:

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

ViewBag.TrckList = truckdat.ToList();
Run Code Online (Sandbox Code Playgroud)

然后在视图中:

@foreach (var item in (IEnumerable<string>)ViewBag.TrckList) 
{
    <div>@item</div>
}
Run Code Online (Sandbox Code Playgroud)

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

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

    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

然后:

@model IEnumerable<TruckData>
@foreach (var item in Model)
{
    <div>@item.Truck</div>
}
Run Code Online (Sandbox Code Playgroud)

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

@model TruckData
<div>@Model</div>
Run Code Online (Sandbox Code Playgroud)

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

@model IEnumerable<TruckData>
@Html.DisplayForModel()
Run Code Online (Sandbox Code Playgroud)