我在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
。
请提供这种情况的解决方案。我真的很困惑如何解决这个问题。
由于
答案 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
}
我希望这会有所帮助。