2015-12-13 127 views
0

我有模型事件和票務使用視圖模型添加模型的多個實例

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] 
    public int TicketsAvailable { get; set; } 
    //navigation property 
    public virtual ICollection<Order> Order { get; set; } 
    //navigation property 
    public virtual ICollection<Ticket> Ticket { get; set; } 
} 

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; } 
    //navigation property 
    public ICollection<OrderDetails> OrderDetails { get; set; } 
} 

而且我已經創建了兩個視圖模型,讓我多門票添加到每個事件

public class TicketVm 
{ 
    [Required] 
    public string Description { get; set; } 
    [Required] 
    public float Price { get; set; } 
} 

public class CreateTicketVm 
{ 
    public int EventId { get; set; } 
    public List<TicketVm> Tickets { set; get; } 
} 

然後我有一個允許用戶創建新事件的視圖。然後,當他們提交此事件時,他們被引導至CreateTicket視圖,該視圖應該使用與創建的事件相同的EventID爲該事件添加新票據。

這是我創建票務觀點

@model Site.Models.CreateTicketVm 

<head> 
<title>Create Event Tickets</title> 
<link href="Content/TicketStyles.css" rel="stylesheet" type="text/css"> 
</head> 


<h3> Tickets</h3> 
<div id="tickets"></div> 
@Html.HiddenFor(s => s.EventId) 

<input type="button" id="add" value="Add Ticket" /> 
<input type="submit" id="btnSave" /> 

@section scripts{ 
<script> 
$(function() { 
    //Lets create the first row 
    addNewRow(); 

    $("#add").click(function (e) { 
     e.preventDefault(); 
     addNewRow(); 
    }); 

    $("#btnSave").click(function (e) { 
     e.preventDefault(); 

     var createTicket = { EventId: $("#EventId").val(), Tickets: [] }; 
     var rows = $("#tickets").find(".item"); 

     $.each(rows, function (i, row) { 
      var _row = $(this); 

      var inputs = _row.find("input"); 
      var ticket = {}; 
      $.each(inputs, function (index, item) { 
       var _this = $(this); 
       ticket[_this.data("for")] = _this.val(); 
      }); 
      createTicket.Tickets.push(ticket); 
     }); 

     var targetUrl = "@Url.Action("CreateTicket","Tickets1")"; 
     $.ajax({ 
      url: targetUrl, 
      contentType: "application/json", 
      data: JSON.stringify(createTicket), 
      type: "POST" 
     }).done(function (res) { 
      if (res.Status === "Success") { 
       window.location.href = "@Url.Action("Success")"; 
      } 
     }); 
    }); 
}); 

function addNewRow() { 
    $.get("@Url.Action("AddNewTicketRow","Tickets1")", function (res) { 
     $("#tickets").append(res); 
    }); 
} 
</script> 
} 

這是我AddNewTicket局部視圖

@model Site.Models.TicketVm 
<div class="item"> 
    @Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" }) 
<div> 
    @Html.TextBoxFor(model => model.Description, new { @data_for = "Description" }) 
</div> 

@Html.LabelFor(model => model.Price, htmlAttributes: new { @class = "control-label col-md-2" }) 
<div> 
    @Html.TextBoxFor(s => s.Price, new { @data_for = "Price" }) 
</div> 
</div> 

這是我Tickets1Controller類

public class Tickets1Controller : Controller 
{ 
    private ApplicationDbContext db = new ApplicationDbContext(); 


    public ActionResult CreateTicket(int id) 
    { 

     var vm = new CreateTicketVm { EventId = id }; 
     return View(vm); 
    } 


    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult CreateTicket(CreateTicketVm model) 
    { 
     if (model != null) 
     { 

      foreach (var ticketVm in model.Tickets) 
      { 
       db.Tickets.Add(new Ticket{ EventID = model.EventId, 
       Description=ticketVm.Description, Price =ticketVm.Price}); 
       db.SaveChanges(); 

      } 
      return RedirectToAction("Index"); 

     } 
     return RedirectToAction("Index"); 
    } 

    public ActionResult AddNewTicketRow() 
    { 
     var vm = new TicketVm(); 
     return PartialView("~/Views/Tickets1/Partials/AddNewTicketRow.cshtml", vm); 
    } 

我的門票不節能,我不明白爲什麼,因爲EventID被傳遞給CreateTicket視圖,但沒有當提交按鈕被點擊並且票據沒有被保存到我的數據庫表中時發生。有關如何解決這個問題的任何建議將非常感謝。

+0

建議你看一下答案[這裏](http://stackoverflow.com/questions/29161481/post-a-form-array-without-successful/29161796#29161796)和[這裏](http://stackoverflow.com/questions/28019793/submit-same-partial-view-called-multiple-times-data-to-controller/28081308#28081308) –

+0

如果你修改你的代碼中的這一行並逐步完成,結果是什麼? 'var result = db.SaveChanges();' – Anders

回答

0

一旦我遇到了同樣的問題,我所做的就是爲頁面定義一個jQuery變量,並在每次單擊「AddNewTicketRow」時增加它,並將其作爲參數發送到「AddNewTicketRow」控制器,並將其用作INDEX創建AddNewTicket局部視圖這樣的:

@Html.TextBoxFor(M => M.Description, new { Name = "Tickets[" + @Model.Index + "].Description", id = "Tickets[" + @Model.Index + "].Description" }) 

@Html.TextBoxFor(M => M.Price, new { Name = "Tickets[" + @Model.Index + "].Price", id = "Tickets[" + @Model.Index + "].Price" }) 
相關問題