【问题标题】:MVC validation for unique唯一性的 MVC 验证
【发布时间】:2011-09-28 23:36:12
【问题描述】:

您好,我有一个用于插入更新发票的 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 在数据库中设置的。所以如果我尝试这样做,它会返回一个异常。

有没有办法不显示异常来捕获它并将自定义错误消息添加到验证摘要?

【问题讨论】:

    标签: asp.net-mvc validation


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以通过将远程属性放在两个属性上来实现这一点,并在 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,并且 null 检查将由 Required 属性处理。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-19
            • 2012-10-10
            相关资源
            最近更新 更多