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

时间:2015-11-18 11:55:28

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

我目前正在使用Umbraco内的MVC建立预订表格。我关心的属性如下:

public class SomeClass {
   private static final Logger LOG =   LoggerFactory.getLogger("DB");
}

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

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

    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; }
    }

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

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

非常感谢任何协助。

1 个答案:

答案 0 :(得分:2)

要完成此任务,您可以创建一个继承自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库,它可以简化你的验证逻辑。