MVC验证独特

时间:2011-09-28 23:36:13

标签: asp.net-mvc validation

您好我有一个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 个答案:

答案 0 :(得分:4)

您可以捕获异常并将错误添加到模型状态,以便您的客户端代码以相同的方式处理所有错误。类似的东西:

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

答案 1 :(得分: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});
    }
}

当您更改表单上任一输入的值并将另一个值作为参数时,将调用此方法。如果任一值为null,则返回true,并且Required属性将处理空检查。

答案 2 :(得分:0)

没有花哨......你可以在控制器中捕获它,然后通过模型成员或ViewBag / ViewData在视图中显示消息。

答案 3 :(得分:0)

您还可以编写一个自定义验证器来为您检查(即使进行了一些客户端验证)。我编写了一个检查数据库是否存在用户名的方法,可以为此完成类似的检查,而不依赖于异常(尽管您仍然希望处理它,但我不建议使用例外进行正常的操作)。