MVC3显示View on Table中的所有记录

时间:2013-07-19 19:43:38

标签: c# asp.net-mvc-3 visual-studio-2012

我在Model中有一个BookingView类:

public class BookingView
{
    [Required]
    [Display(Name = "Attraction")]
    public int Attraction { get; set; }

    [Required]
    [Display(Name = "Date")]
    public string Date { get; set; }

    [Required]
    [Display(Name = "Username")]
    public string Username { get; set; }
}

数据库中针对此模型的表格为Tickets

我需要在名为BookingManager的模型中的另一个类中编写一个函数来获取所有票证记录。

public IEnumerable<BookingView> GetAllBookings()
{
    var a = from o in dre.Tickets select o;
    return a.ToList();
}

我想在名为ViewAllBookings的视图中显示这些记录:

@model IEnumerable<VirtualTickets.Models.ViewModel.BookingView>

@{
  ViewBag.Title = "ViewAllBookings";
}

<h2>ViewAllBookings</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
    <th>
        Attraction
    </th>
    <th>
        Date
    </th>
    <th>
        Username
    </th>
    <th></th>
</tr>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Attraction)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Date)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Username)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
    </td>
</tr>
}

</table>

该函数在return语句的函数GetAllBookings中给出complie时间错误。如果我将返回类型更改为Ticket,那么我会得到预期的运行时错误,因为在视图ViewAllBookings中,它期望IEnumerable列表的类型为BookingView

请提供这种情况的解决方案。我真的很困惑如何解决这个问题。

由于

4 个答案:

答案 0 :(得分:2)

您的设置似乎需要将实体类Ticket转换为视图模型BookingView。我想你需要这样的东西:

return a.AsEnumerable().Select(ticket => new BookingView 
    {
        Attraction = ticket.SomeProperty,
        // etc
    })
.ToList();

答案 1 :(得分:1)

您必须编写将Ticket映射到BookingView的方法,并使用它:

public IEnumerable<BookingView> GetAllBookings()
{
    var a = from o in dre.Tickets select o;
    return a.AsEnumerable().Select(Map).ToList();
}

private BookingView Map(Ticket ticket)
{
    var bookingView = new BookingView();
    //mapping code goes here
    return bookingView;
}

答案 2 :(得分:1)

我不确定您的Tickets表实际上是否与代码中的BookingView类具有相同的列,但如果这是表与您的类之间的映射,那么您的解决方案将是:< / p>

var a = from o in dre.Tickets 
         select new BookingView  { Attraction= o.Attraction, 
                                   Date=o.Date, 
                                   Username = o.UserName } ;
return a.ToList();

答案 3 :(得分:0)

是的,很明显您收到此错误是因为您要返回Ticket对象,并且您的视图需要BookingView个对象的列表。 2不匹配,即它们不相同。

您的BookingManager应该将您的门票退还给控制器。这是我如何做到的另一种方式。

您可以将视图模型更改为:

public class BookingViewModel
{
     public List<Ticket> Tickets { get; set; }
}

您的BookingManager可以包含以下方法来退回门票:

public class BookingManager : IBookingManager
{
     // References to your database context

     public IEnumerable<Ticket> GetAllTickets()
     {
          return databaseContext.Tickets;
     }
}

在您的预订控制器中,您可以使用IBookingManager dependency injection framework注入AutoFac的实例:

public class BookingController : Controller
{
     private readonly IBookingManager bookingManager;

     public BookingController(IBookingManager bookingManager)
     {
          this.bookingManager = bookingManager;
     }

     public ActionResult Index()
     {
          BookingViewModel viewModel = new BookingViewModel
          {
               Tickets = bookingManager.GetAllTickets().ToList()
          };

          return View(viewModel);
     }
}

然后在你的观点上:

@model YourProject.ViewModels.Tickets.BookingViewModel

@foreach (var ticket in Model.Tickets)
{
     // Display ticket details here
}

我希望这会有所帮助。