“至少需要一个”情况的 MVC3 自定义验证属性
本文关键字:情况 MVC3 自定义 属性 验证 一个 | 更新日期: 2023-09-27 18:31:12
嗨,我已经找到了这个答案:MVC3 验证 - 需要组中的一个验证
这相当具体地用于检查组名并使用反射。
我的例子可能更简单一些,我只是想知道是否有更简单的方法可以做到这一点。
我有以下内容:
public class TimeInMinutesViewModel {
private const short MINUTES_OR_SECONDS_MULTIPLIER = 60;
//public string Label { get; set; }
[Range(0,24, ErrorMessage = "Hours should be from 0 to 24")]
public short Hours { get; set; }
[Range(0,59, ErrorMessage = "Minutes should be from 0 to 59")]
public short Minutes { get; set; }
/// <summary>
///
/// </summary>
/// <returns></returns>
public short TimeInMinutes() {
// total minutes should not be negative
if (Hours <= 0 && Minutes <= 0) {
return 0;
}
// multiplier operater treats the right hand side as an int not a short int
// so I am casting the result to a short even though both properties are already short int
return (short)((Hours * MINUTES_OR_SECONDS_MULTIPLIER) + (Minutes * MINUTES_OR_SECONDS_MULTIPLIER));
}
}
我想向小时和分钟属性或类本身添加一个验证属性......这个想法是确保这些属性中至少有 1 个(小时或分钟)具有值,服务器端和客户端使用自定义验证属性进行验证。
请问有人有这方面的例子吗?
谢谢
查看 FluentValidation http://fluentvalidation.codeplex.com/或者您可以对要检查是否至少有一个属性具有值的每个 ViewModel 使用此小助手,或者根据需要进一步修改它。
public class OnePropertySpecifiedAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
Type typeInfo = value.GetType();
PropertyInfo[] propertyInfo = typeInfo.GetProperties();
foreach (var property in propertyInfo)
{
if (null != property.GetValue(value, null))
{
return true;
}
}
return false;
}
}
并将其应用于您的视图模型:
[OnePropertySpecified(ErrorMessage="Either Hours or Minutes must be specified.")]
public class TimeInMinutesViewModel
{
//your code
}
问候。
链接到的示例通过将属性应用于属性来定义组,这提供了很大的灵活性。 这种灵活性的成本是反射代码。 不太灵活的办法更容易实施,但适用范围更窄。
这是这种方法的 IsValid 方法;我将留给您来改编另一个示例的其余部分:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var viewModel = value as TimeInMinutesViewModel;
if (viewModel == null)
{
//I don't know whether you need to handle this case, maybe just...
return null;
}
if (viewModel.Hours != 0 || viewModel.Minutes != 0)
return null;
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}