创建自定义数据注释以确保至少填充模型中三个字段中的一个字段

本文关键字:字段 一个 三个 模型 注释 数据 自定义 确保 填充 创建 | 更新日期: 2023-09-27 18:22:19

我目前正在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; }
    }

UmbracDisplayName注释只是从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);
                    }

这确实起到了作用,但并不符合惯例。我的问题是,我该如何创建数据注释,以便它对具有注释的模型的所有属性进行比较,并检查值是null还是空?

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

如有任何协助,我们将不胜感激。

创建自定义数据注释以确保至少填充模型中三个字段中的一个字段

要完成此任务,您可以创建一个从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库,它可以简化很多验证逻辑。