【问题标题】:Creating a custom data annotation to ensure at least one of three fields in the model is populated创建自定义数据注释以确保至少填充模型中的三个字段之一
【发布时间】:2016-02-20 03:38:36
【问题描述】:

我目前正在 Umbraco 中使用 MVC 构建预订表单。我关心的属性如下:

    public class BookingModel{

        public bool Previous { get; set; }
        public bool Next { get; set; }
        public int Stage { get; set; }
        public int Price { get; set; }

        public Tour_Instance Tour_Instance { get; set; }
        public Passenger_Count Passenger_Count {get; set;}
        public Passenger_Details Passenger_Details { get; set; }
        public BookingConfirmation Booking_Confirmation { get; set; }
    }

    public class Passenger_Details{
       [UmbracoDisplayName("Booking.Display.PhoneMobile")]
       public string Phone_Mobile { get; set; }

       [UmbracoDisplayName("Booking.Display.PhoneHome")]
       public string Phone_Home { get; set; }

       [UmbracoDisplayName("Booking.Display.PhoneWork")]
       public string Phone_Work { get; set; }
    }

UmbracoDisplayName 注释只是从 Umbraco 中的字典中检索一个值,该值会更改显示在每个项目旁边的标签的值。理想情况下,我想创建一个自定义数据注释,以确保上面显示的至少一个属性(Phone_mobile、Phone_Home、Phone_Work)具有值。

目前我正在控制器中执行以下操作:

if (string.IsNullOrWhiteSpace(model.Passenger_Details.Phone_Mobile) && string.IsNullOrWhiteSpace(model.Passenger_Details.Phone_Home) && string.IsNullOrWhiteSpace(model.Passenger_Details.Phone_Work))
                    {
                        ModelState.AddModelError("Passenger_Details.Phone_Mobile", Umbraco.GetDictionaryValue("Booking.Validation.OnePhoneRequired"));
                        ModelState.AddModelError("Passenger_Details.Phone_Home", string.Empty);
                        ModelState.AddModelError("Passenger_Details.Phone_Work", string.Empty);
                    }

这可以完成工作,但并不真正符合惯例。我的问题是,我将如何创建数据注释,以便它比较具有注释的模型的所有属性并检查值是空还是空?

我知道如何创建自定义注释,它基本上只是我必须遵循的逻辑,我正在努力想出。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net model-view-controller umbraco data-annotations


    【解决方案1】:

    要完成此任务,您可以创建一个继承自 ValidationAttribute 的类并实现类似于:

    public class OnePhoneRequiredAttribute : ValidationAttribute
    {
      protected override ValidationResult IsValid(object value, ValidationContext validationContext)
      {
        var passengerDetails = value as Passenger_Details;
        if (passengerDetails == null)
        {
            // handle depending on your situation
        }
    
        if (string.IsNullOrWhiteSpace(passengerDetails.Phone_Mobile) 
            && string.IsNullOrWhiteSpace(passengerDetails.Phone_Home) 
            && string.IsNullOrWhiteSpace(passengerDetails.Phone_Work))
        {   
            return new ValidationResult(Umbraco.GetDictionaryValue("Booking.Validation.OnePhoneRequired"));
        }
    
        return null;
      }
    }
    

    然后将此属性添加到您的模型中:

    [OnePhoneRequired]
    public Tour_Instance Tour_Instance { get; set; }
    

    编辑:另外看看FluentValidation 库,它可以大大简化您的验证逻辑。

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 2011-08-04
      • 2021-10-05
      相关资源
      最近更新 更多