2011-09-28 89 views
3

您好我有一個MVC應用程序,我用來插入更新發票:MVC驗證獨特

public class Invoice : IEntity, IValidatableObject 
    { 
     public virtual int InvoiceId { get; set; } 

     [Required(ErrorMessage = "Invoice Number is a required field.")] 
     [Column(TypeName = "varchar")] 
     [StringLength(20)] 
     [Display(Name = "Invoice Number:")] 
     public virtual string InvoiceNumber { get; set; } 

     [Required(ErrorMessage = "Organisation is a required field.")] 
     [Display(Name = "Organisation:")] 
     public int OrganisationId { get; set; } 

       ... 
} 

的問題是我有一個要求「組織和發票號碼的組合必須是唯一的

因此,這是由數據庫中的DBA設置的,所以如果我嘗試這樣做,它會返回一個異常。

有沒有辦法顯示異常來捕獲它並添加自定義錯誤消息驗證總結?

回答

4

你可以捕獲該異常和錯誤添加到模型狀態,這樣你的客戶端代碼處理所有的錯誤一樣。喜歡的東西:

ModelState.AddModelError("InvoiceNumber", "The combination of organisation and invoice number must be unique."); 
0

沒有花哨......你可以在控制器中捕獲它,然後通過模型或ViewBag/ViewData成員在視圖中顯示消息。

0

你也可以寫(即使有一些客戶端驗證以及)檢查此爲你定製驗證。我寫了一個檢查數據庫的用戶名是否存在的類似的檢查可以做到這一點,而不依賴於例外(儘管你仍然想要處理它,我不會建議使用例外的正常行爲)。

4

則可以通過遠程屬性的這兩個屬性和AdditionalField參數實現這一點,你通過其他財產的名稱,如

[Remote("IsUnique","home",AdditionalFields = "OrganisationID",ErrorMessage = "abc")] 
virtual string InvoiceNumber { get; set; } 

     [Required(ErrorMessage = "Organisation is a required field.")] 
     [Display(Name = "Organisation:")] 
     [Remote("IsUnique","home",AdditionalFields = "InvoiceNumber",ErrorMessage = "abc")] 
     public int OrganisationId { get; set; } 

,你可以寫像

在家居控制器(例如) InUnique方法
public JsonResult IsUnique(string InvoiceNumber, int? OrganisationID) 
{ 
    if(InvoiceNumber == null || !Organisation.HasValue) 
    { 
     return Json({valid = true});//null check is not job of this attribute 
    } 
    else 
    { 
     bool result = CheckDbForUniqueness(InvoiceNumber, OrganisationID.Value); 
     return Json({valid = result}); 
    } 
} 

當更改的形式或者輸入值,並採取其它值作爲參數時,該方法將被調用。如果任一值爲空,則它將返回true,並且空檢查將由Required屬性處理。