创建自定义数据注释以确保至少填充模型中三个字段中的一个字段
本文关键字:字段 一个 三个 模型 注释 数据 自定义 确保 填充 创建 | 更新日期: 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库,它可以简化很多验证逻辑。