2014-03-12 22 views
0

我在調試catch (Exception e)時收到了此消息。當用戶填寫所有信息時,Address and PaymentView將獲得SalesOrderID並重定向到完整視圖。但它完成後沒有顯示完成。保存我的實體時拋出EntityValidationException

[HttpPost] 
     public ActionResult AddressAndPayment(SalesOrderHeader order,Customer customer, Address address ,FormCollection values) 
     { 
      ViewBag.PersonType = new SelectList(new[] { "EM", "SC", "VC", "IN" } // work 
                .Select(x => new { value = x, text = x }), 
                "value", "text"); 
      try 
      { 
       if (string.Equals(values["PromoCode"], PromoCode, StringComparison.OrdinalIgnoreCase) == false) 
       { 
        return View(order); 
       } 
       else 
       { 
        order.AccountNumber = User.Identity.Name; 
        order.OrderDate = DateTime.Now; 
        address.ModifiedDate = DateTime.Now; // maybe this error 
        order.Address.PostalCode = "12345"; 

        //Save Order 
        BikeDBs.SalesOrderHeaders.Add(order); 
        try 
        { 
         BikeDBs.SaveChanges(); 
        } 
        catch (DbEntityValidationException e) 
        { 
         foreach (var entityValidationErrors in e.EntityValidationErrors) 
         { 
          foreach (var validationError in entityValidationErrors.ValidationErrors) 
          { 
           Console.WriteLine("Properties: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 
          } 
         } 
        } 
        //Process Order 
        var cart = ShoppingCart.GetCart(this.HttpContext); 
        cart.CreateOrder(order); 
        //cart.CreateOrder(order1); 
        return RedirectToAction("Complete", new { id = order.SalesOrderID }); 
       } 
      } 
      catch (Exception exception) 
      { 
       //Invalid - redisplay with errors 
       return View(order); 
      } 

所有我想要的是在保存的Order,它會重定向到Complete。但在這種情況下,事實並非如此。這裏是Address型號:

public partial class Address 
    { 
     public Address() 
     { 
      this.SalesOrderHeaders = new HashSet<SalesOrderHeader>(); 
      this.SalesOrderHeaders1 = new HashSet<SalesOrderHeader>(); 
     } 

     public int AddressID { get; set; } 
     public string AddressLine1 { get; set; } 
     public string AddressLine2 { get; set; } 
     public string City { get; set; } 
     public int StateProvinceID { get; set; } 
     public string PostalCode { get; set; } 
     public System.Guid rowguid { get; set; } 
     [Required()] 
     public Nullable<System.DateTime> ModifiedDate { get; set; } 

     public virtual StateProvince StateProvince { get; set; } 
     public virtual ICollection<SalesOrderHeader> SalesOrderHeaders { get; set; } 
     public virtual ICollection<SalesOrderHeader> SalesOrderHeaders1 { get; set; } 
    } 

什麼是解決方案,以及如何解決它?

+0

您是否嘗試過包裹你的邏輯在' if(ModelState.IsValid){//添加訂單並重定向}返回View(order); //顯示錯誤'?該*應該*捕捉你的EF驗證錯誤。當你得到EF驗證錯誤時,你應該再次顯示錶單,而不是繼續,因爲如果前一個失敗,顯示下一頁可能沒有任何意義。 –

回答

1

你可以通過使用ModelState很容易地做到這一點,它應該抓住它。如果它沒有將代碼添加到catch塊中以捕獲它並使用ModelState.AddModelError再次顯示錯誤頁面。

[HttpPost] 
public ActionResult AddressAndPayment(SalesOrderHeader order,Customer customer, Address address ,FormCollection values) 
{ 
    ViewBag.PersonType = new SelectList(new[] { "EM", "SC", "VC", "IN" } // work 
               .Select(x => new { value = x, text = x }), 
               "value", "text"); 
    if(ModelState.IsValid) 
    { 
     try 
     { 
      if (string.Equals(values["PromoCode"], PromoCode, StringComparison.OrdinalIgnoreCase) == false) 
      { 
       return View(order); 
      } 
      else 
      { 
       order.AccountNumber = User.Identity.Name; 
       order.OrderDate = DateTime.Now; 
       order.Address.PostalCode = values["PostalCode"]; 

       //Save Order 
       BikeDBs.SalesOrderHeaders.Add(order); 
       try 
       { 
        BikeDBs.SaveChanges(); 
       } 
       catch (DbEntityValidationException e) 
       { 
        foreach (var entityValidationErrors in e.EntityValidationErrors) 
        { 
         foreach (var validationError in entityValidationErrors.ValidationErrors) 
         { 
          // If this far add errors to model errors and show view again. 
          ModelState.AddModelError(validationError.PropertyName, validationError.ErrorMessage); 
          Console.WriteLine("Properties: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 
         } 
        } 
        return View(order); 
       } 
       //Process Order 
       var cart = ShoppingCart.GetCart(this.HttpContext); 
       cart.CreateOrder(order); 
       //cart.CreateOrder(order1); 
       return RedirectToAction("Complete", new { id = order.SalesOrderID }); 
      } 
     } 
     catch (Exception exception) 
     { 
      //Invalid - redisplay with errors 
      return View(order); 
     } 
    } 
    return View(order); 
} 
+0

謝謝你的時間!我仍然有一個錯誤'錯誤消息=「PostalCode字段是必需的。」'你知道如何解決它? –

+0

@TrungPham你在視圖上看到了嗎?你應該因爲這意味着你的模型需要該字段有一個值,而你沒有提交一個值,或者它不能將表單字段映射到你的對象(表單字段名稱中的拼寫錯誤?)。你可以做一個斷點並確認你的模型沒有空字段嗎? –

+0

'@ Html.DisplayNameFor(model => model.Address.ModifiedDate): @ Html.Kendo()。DatePicker()。Name(「ModifiedDate」) @ Html.ValidationMessageFor(m => m.Address.ModifiedDate) '。我像這樣在View中設置。這是錯的嗎?因爲它仍然拋出一箇舊的錯誤。 –

1

我的回答我假設性PostalCodePersonTypestring型的和被定義爲not nullable

我認爲你得到的錯誤信息清楚地說明了問題所在。需要屬性PostalCodePersonType,這意味着它們需要具有除null以外的其他值。

因此,當您不將屬性設置爲非null值並嘗試保存實體時,您將收到錯誤消息。

要修復它你會網的屬性設置爲某個值(可能是默認值),或者你必須改變你的EntityModel指定這些屬性nullable

+0

'[Required(ErrorMessage = 「PostalCode是必需的」)] public string PostalCode {get;組; }'。我修正了它,但它仍然有錯誤,它有一個'錯誤消息=「PostalCode字段是必需的。」# –

+0

@TrungPham你檢查了保存實體時在PostalCode上設置的值嗎? – Jehof

+0

'Nullable:False'當我將它設置爲true並且出現錯誤導致實體不匹配@Jehof –

相關問題