2014-06-06 50 views
0

我想添加多個文本框值到數據庫它只是在單個文本框行上工作,但現在工作時我添加多行文本框。我分享了迄今爲止我所做的。錯誤添加多個記錄MVC

操作方法:

public async Task<ActionResult> Create(FormCollection values) 
{ 
    var customer = new Customer(); 
    var model = new TicketViewModel(); 
    TryUpdateModel(model.TicketDetail); 

    try 
    { 
     foreach (var ticket in model.Tickets) 
     { 
      ticket.Date = DateTime.Now; 
      ticket.ProcessId = DateTime.Now.Ticks.ToString().Substring(12, 6); 
      ticket.CreationMethod = "Manual"; 
      ticket.isCustomer = User.IsInRole("Customer") ? true : false; 
      ticket.Total = 0; 
      ticket.Email = model.TicketDetail.Ticket.Email; 

      customer.City = "Not Specified"; 
      customer.Country = "Not SPecified"; 
      customer.Image = "~/Images/nopic.jpg"; 
      customer.Password = System.Web.Security.Membership.GeneratePassword(11, 3); 
      customer.IsActive = true; 
      customer.CreationMethod = "Manual"; 
      customer.DateAdded = DateTime.Now; 
      customer.Email = ticket.Email; 
      customer.FirstMidName = string.IsNullOrEmpty(ticket.FullName) ? "Not Specified" : ticket.FullName; 
      customer.LastName = "Not Specified"; 
      customer.Salutation = "Not Specified"; 
      customer.UserName = DateTime.Now.Ticks.ToString().Substring(3, 9); 

      //ticket detail 
      var abcd = values["abcd"].ToString(); 
      var getID = await db.Parts.Where(c => c.PartNumber == abcd) 
             .FirstOrDefaultAsync(); 

      model.TicketDetail.GenericOrderId = ticket.GenericOrderId; 
      model.TicketDetail.PersonID = customer.PersonID; 
      model.TicketDetail.Status = "New"; 
      model.TicketDetail.PartId = getID.PartId; 
      model.TicketDetail.Ticket.Date = DateTime.Now; 
     } 

     try 
     { 
      // db.Tickets.Add(ticket); 
      db.Customers.Add(customer); 
      db.TicketDetails.Add(model.TicketDetail); 
     } 
     catch (Exception ex) 
     { 
      ViewBag.PartId = new SelectList(db.Parts.Take(5), "PartId", "Name"); 
      ModelState.AddModelError("", string.Format(ex.Message + "\n" + ex.InnerException)); 

      return View(model.TicketDetail); 
     } 

     // Save all changes 
     await db.SaveChangesAsync(); 

     return RedirectToAction("Index"); 
    } 
    catch(Exception ex) 
    { 

     ModelState.AddModelError("", String.Format(ex.Message + "\n" + ex.InnerException)); 
     //Invalid - redisplay with errors 
     return View(model.TicketDetail); 
    } 
} 

視圖模型:

public class TicketViewModel 
{ 
    public TicketViewModel() 
    { 
     TicketDetails = new List<TicketDetail>(); 
     TicketDetail = new TicketDetail(); 
     Ticket = new Ticket(); 
     Tickets = new List<Ticket>(); 
    } 
    public virtual Ticket Ticket { get; set; } 
    public virtual IEnumerable<Ticket> Tickets { get; set; } 

    public virtual TicketDetail TicketDetail { get; set; } 
    public virtual IEnumerable<TicketDetail> TicketDetails { get; set; } 
} 

它也對這個給錯誤 「TryUpdateModel(model.TicketDetail);」錯誤是價值不能爲空,請指導我我卡在這裏我搜索互聯網,但找不到任何合適的解決方案。我想添加多個記錄

+1

TicketViewModel類TicketDetail的屬性似乎未初始化/分配,因此它爲空...使用構造函數初始化屬性! – BionicCode

+0

感謝您的評論,我怎麼能解決這個問題?我想將多個texboxes記錄添加到數據庫中 – Anony

+0

您需要向您的TicketViewModel添加一個構造函數,該構造函數創建一個TicketDetail – BionicCode

回答

0

首先,TicketViewModel類的所有屬性都必須實例化。

要添加多個記錄(多個插入),您可以使用一個StringBuilder並將插入語句附加到它。然後您將在數據庫中執行一個大的查詢字符串。

如果使用值,這也是一個有效的辦法:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 

並加載數據直接從文件中插入的還要快。

編輯 (後下無故投票)因爲有人像他們知道這一切:與數據庫訪問打交道時

SQL注入確實是一個嚴重的問題。這完全不是祕密。一種常見的技術可以防止SQL查詢被「劫持」,您只需使用SQLCommand.Parameters屬性,該屬性用於將每個值分別映射到語句,從而以這種方式將查詢語句與數據(值)分開。現在不可能在不破壞它們的情況下注入或操縱語句。並且服務器端驗證是標準的,以獲得最大的安全性以及轉義特殊輸入字符並避免使用沒有限制或低限制的特權。

這不是一個錯誤的答案。

+0

手動構造語句只是要求SQL注入攻擊。另外,OP使用一個可以自動創建語句的ORM。 –

+0

是的,但使用command.Parameters選項時,這並不容易。你有投票嗎?扭轉它! – BionicCode

+0

@BionicCode問題是它不是發送值foreach循環,我有調試代碼,並發現列表計數爲零,我怎麼能解決這個問題? – Anony