2016-01-10 2 views
2

У меня возникла проблема с созданием соответствующего ViewModel, чтобы разрешить пользователю выбирать несколько билетов сразу в представлении.Использование ViewModels и Partial View с asp.net mvc

У меня есть модель по продаже билетов

public class Ticket 
{ 
    public int TicketID { get; set; } 

    [Required] 
    [ForeignKey("Event")] 
    //foreign key 
    public int EventID { get; set; } 

    [Required] 
    public string Description { get; set; } 

    [Required] 
    public float Price { get; set; } 

    //navigation property 
    public virtual Event Event { get; set; } 

} 

Ордер Модель

public class Order 
{ 

    public int OrderID { get; set; } 

    //foreign key 
    [Required] 
    [ForeignKey("Event")] 
    public int EventID { get; set; } 


    [Required] 
    public DateTime OrderDate { get; set; } 

    [Required] 
    public float OrderTotal { get; set; } 

    public ApplicationUser user { get; set; } 

    public virtual Event Event { get; set; } 
} 

Тогда у меня есть модель Детали_Заказов

public class OrderDetails 
{ 

    [Required] 
    public int OrderDetailsID { get; set; } 


    [Required] 
    //Foreign key 
    [ForeignKey("Order")] 
    public int OrderID { get; set; } 

    [Required] 
    //Foreign key 
    [ForeignKey("Ticket")] 
    public int TicketID { get; set; } 

    [Required] 
    public string FirstName { get; set; } 

    [Required] 
    public string LastName { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    public string email { get; set; } 

    [Required] 
    [DataType(DataType.PhoneNumber)] 
    public int PhoneNumber { get; set; } 

    //navigation properties 
    public virtual Order Order { get; set; } 

    public virtual Ticket Ticket { get; set; } 

} 

Я также создал дополнительную модель TicketsOrdered как я не» t знаю, где еще я могу сохранить количество каждого типа билета, выбранного пользователем

public class TicketsOrdered 
{ 

    public int OrderID; 

    public int TicketID; 

    public int Quantity; 
} 

Я хочу создать представление, которое будет отображать Описание билетов и стоимость каждого билет, относящийся к определенному событию, то там также будет выпадающее/текстовым полем, чтобы разрешить пользователям вводить количество каждого билета они требуют , Затем я хочу сохранить TicketID, OrderID и количество в таблице TicketsOrdered db. Проблема, с которой я сталкиваюсь, заключается в том, что все данные относятся ко многим моделям, и я не знаю, как собрать все это вместе. Я получаю полную потерю от того, как это сделать, примером того, как я хочу, это посмотреть, когда вы нажимаете на билеты на EventBrite. Любая помощь в ViewModel, которая будет работать или как использовать мои текущие модели в представлении, была бы действительно полезной.

EDIT Модель событий

public class Event 
{ 
    public int EventID { get; set; } 

    [Required] 
    public String Name { get; set; } 

    [Required] 
    public String Location { get; set; } 

    [Required] 
    [DataType(DataType.Date)] 
    public DateTime Date { get; set; } 

    [Required] 
    [DataType(DataType.MultilineText)] 
    public String Description { get; set; } 

    [Required] 
    [Display(Name = "Total Tickets Available")] 
    public int TicketsAvailable { get; set; } 

    //navigation property 
    public virtual IEnumerable<Order> Order { get; set; } 
    //navigation property 
    public virtual IEnumerable<Ticket> Tickets { get; set; } 

} 
+0

Вы утверждаете _for каждого билета, относящийся к конкретному Event_, но ваши модели показывают, у вас есть только один билет на мероприятие, а не сбор билетов. Какова ваша модель «Событие»? Он содержит свойство 'IEnumerable '? –

+0

Да У меня есть модель события, содержащая IEnumerable @StephenMuecke.Какую модель мне нужно изменить, чтобы показать, что каждое событие может иметь несколько билетов? Спасибо – CatherineG

+0

Его еще немного неясно, каковы ваши отношения. У каждого «события» также есть коллекция разных типов «Ticket»? И идея состоит в том, что вы хотите создать «Order» для «Event», который отображает все доступные типы билетов для этого «Event» и позволяет пользователю вводить количество для каждого (например, они хотят, чтобы 2 стандартных билета и 2 класса Билеты)? –

ответ

2

Начнем с создания представлений модели, которые представляют собой то, что вы хотите отобразить/редактировать в окне

public class TicketVM 
{ 
    public int TicketID { get; set; } 
    public string Description { get; set; } 
    public decimal Price { get; set; } 
    public int Quantity { get; set; } 
} 
public class OrderVM 
{ 
    public int ID { get; set; } 
    public int EventID { get; set; } 
    public string EventName { get; set; } 
    // additional properties of Event you want to display 
    public DateTime OrderDate { get; set; } 
    public string FirstName { get; set; } 
    // additional properties of Order and OrderDetails you want to edit 
    public List<TicketVM> Tickets { get; set; } 
} 

Side Примечание: Его немного непонятно, почему ты имеют отдельные модели для Order и OrderDetails, или почему OrderDetails имеет public int TicketID { get; set; }, что предполагает, что Order может иметь только один тик ket, поэтому я предлагаю вам внести некоторые изменения в структуру вашей базы данных. Если намерение состоит в том, что пользователь может заказать несколько билетов для разных людей, то имя, адрес электронной почты и телефон каждого владельца билета, вероятно, следует хранить в TicketsOrdered таблице (и те свойства, добавленные к TicketVM классу)

мнения затем будет (при условии, ITS для метода Create)

@model TicketVM 
@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(m => m.EventID) 
    <h2>@Model.EventName</h2> 
    // other display properties of event 
    @Html.TextBoxFor(m => m.OrderDate) 
    @Html.TextBoxFor(m => m.FirstName) 
    // other edit control for properties of Order and OrderDetails (see note above) 
    @Html.EditorFor(m => m.Tickets) 
    <input type="submit" value="Save" /> 
} 

и EditorTemplate для TicketVM/Views/Shared/EditorTemplates/TicketVM.cshtml)

@model TicketVM 
@Html.HiddenFor(m => m.TicketID) 
@Html.DisplayFor(m => m.Description) 
@Html.DisplayFor(m => m.Price) 
@Html.TextBoxFor(m => m.Quantity) 

Тогда методы контроллера будут (обратите внимание, вы не показали вам Event модели так настроить следующий в соответствии с)

public ActionResult Create(int ID) // assumes ID is the ID of the Event 
{ 
    // Get the event and its tickets 
    Event e = db.Events.Where(e = e.EventID = ID).Include(e => e.Tickets); 
    // Initialize a new order 
    OrderVM model = new OrderVM 
    { 
    EventID = e.EventID, 
    EventName = e.EventName, 
    // other properties of event as required 
    Tickets = e.Tickets.Select(t => new TicketVM 
    { 
     TicketID = t.TicketID, 
     Description = t.Description, 
     Price = t.Price 
    }) 
    }; 
    return View(model); 
} 
[HttpPost] 
public ActionResult Create(OrderVM model) 
{ 
    if (!ModelState.IsValid) 
    { 
    // repopulate any properties as required 
    return View(model); 
    } 
    // Initialize an Order data model, save it and gets its ID 
    Order order = new Order 
    { 
    OrderDate = model.OrderDate, 
    // other properties of Order 
    }; 
    db.Orders.Add(order); 
    db.SaveChanges(); 
    // ditto for OrderDetails (but see notes above) 

    // Initialize an TicketsOrdered data model for each valid ticket 
    foreach(TicketVM ticket in model.Tickets.Where(t => t.Quantity > 0)) 
    { 
    TicketsOrdered ticketOrder = new TicketsOrdered 
    { 
     OrderID = order.ID, 
     TicketID = ticketOrder.TicketID, 
     Quantity = ticketOrder.Quantity 
    } 
    db.TicketsOrdered.Add(ticketOrder); 
    } 
    db.SaveChanges(); 
    return RedirectToAction(...); 
} 
+0

спасибо @StephenMuecke. Я сделал ошибку, когда сказал, что у меня есть IEnnumerable в моей модели Event. Затем, когда я добавил это к модели, я не знаю, как добавить к ней билет. Я обновил сообщение, чтобы включить модель Event. Я попытался изменить IEnnumerable на IList вместо этого, поэтому я могу использовать метод Add, но это вызвало исключение в отношении этой строки. Tickets = e.Tickets.Select (t => new TicketVm { – CatherineG

+0

Невозможно увидеть какое-либо обновление с помощью модели 'Event'. он не включает свойство коллекции для билетов, тогда вы можете заполнить 'OrderVM', используя что-то вроде' Tickets = db.Tickets.Where (t => t.EventID = ID). Выберите (t => new TicketVM {TicketID = t.TicketID, Описание = t.Description, Price = t.Price}) '. Но, как я упоминал ранее, я подозреваю, что может быть несколько проблем с дизайном вашей базы данных. –

+0

Это замечательно, большое вам спасибо за все ваши помогите, я очень ценю, что вы тратите свое время, чтобы помочь мне @StephenMuecke! – CatherineG

Смежные вопросы