2013-07-19 3 views
1

У меня есть класс BookingView в Model:MVC3 Показать все записи из таблицы на View

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> 

Функция дает Скомпилируйте ошибки времени в функции GetAllBookings на оператора возврата. Если я изменю тип возвращаемого значения на Ticket, тогда я получаю ошибку времени выполнения, как ожидалось, потому что на вид ViewAllBookings ожидает IEnumerable Список записей, имеющих тип BookingView.

Пожалуйста, предоставьте решение этой проблемы. Я действительно смущен, как с этим бороться.

Благодаря

ответ

2

Похоже, ваша установка требует преобразования класса сущностей Ticket в модели представления BookingView. Я думаю, вам нужно что-то вроде этого:

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

спасибо. это сработало! – Azeem

1

Вы должны написать метод, который отображает билет на 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; 
} 
1

Я не уверен, если ваш Tickets таблица на самом деле имеет то же самое колонны как BookingView класса в вашем коде, но если theere это отображение между столом и вашего класса, ваше решение будет:

var a = from o in dre.Tickets 
     select new BookingView { Attraction= o.Attraction, 
            Date=o.Date, 
            Username = o.UserName } ; 
return a.ToList(); 
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 
} 

Я надеюсь, что это помогает.