如何在asp.net mvc3中允许无值或特定值的属性
本文关键字:属性 许无值 asp net mvc3 | 更新日期: 2023-09-27 18:05:49
我有3个属性的自定义类,它的日期,小时和分钟。这些表示用户可以输入的字段,但它们不是必需的,但是如果一个字段被填充,那么其他两个字段也应该被填充(不确定这部分在纯c#中是可能的)
我把这个代码改成
[RegularExpression("[0-9]{2}-[0-9]{2}-[0-9]{4}", ErrorMessage = "Date should be in the following format: dd-mm-yyyy")]
[MaxLength(10)]
public string Date { get; set; }
[CustomRange(0, 24, ErrorMessage = "Hour must be between 00 and 24")]
public string Hour { get; set; }
[CustomRange(0, 59, ErrorMessage = "Hour must be between 00 and 59")]
public string Minute { get; set; }
.
public class CustomRangeAttribute : ValidationAttribute
{
public int Min { get; set; }
public int Max { get; set; }
public CustomRangeAttribute(int min, int max)
{
Min = min;
Max = max;
}
public override bool IsValid(object value)
{
var stringValue = Convert.ToString(value, CultureInfo.CurrentCulture);
int tmp;
if(int.TryParse(stringValue, out tmp))
{
return tmp >= Min && tmp <= Max;
}
return false;
}
}
日期部分工作得很好,那一个是可选的,但它抱怨的小时和分钟,好像他们有[Required],所以有可能使他们可选吗?
我改了,所以我用正则表达式代替
[RegularExpression("[0-9]{2}-[0-9]{2}-[0-9]{4}", ErrorMessage = "Date should be in the following format: dd-mm-yyyy")]
[MaxLength(10)]
public string Date { get; set; }
[RegularExpression("[0-1]{1}[0-9]{1}|[2]{1}[0-3]{1}")]
public string Hour { get; set; }
[RegularExpression("[0-5]{1}[0-9]{1}")]
public string Minute { get; set; }
为了满足某些字段仅在某些情况下需要的要求,您可以使用IValidateableObject
实现自定义验证逻辑如何使用IValidatableObject?
提供一个很好的概述
基本上public MyCustomClass:IValidateableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
//your custom "model-wide" business rules here
}
}
至于小时和分钟,是否有任何理由使用字符串而不是可空的int?
ie[Range(0,24,ErrorMessage="Hour must be between 00 and 24")]
public int? Hour {get; set;}
编辑:好了,现在你已经编辑了你的第一篇文章,并包括了你的自定义验证属性,它不工作的原因很明显
当前代码
public override bool IsValid(object value) {
var stringValue = Convert.ToString(value, CultureInfo.CurrentCulture);
int tmp;
if(int.TryParse(stringValue, out tmp))
{
return tmp >= Min && tmp <= Max;
}
return false;
}
当value == null时返回false。
添加nullorempty值的检查是您需要的,即
public override bool IsValid(object value) {
var stringValue = Convert.ToString(value, CultureInfo.CurrentCulture);
if (String.IsNullOrEmpty(stringValue))
{
return true;
}
int tmp;
if(int.TryParse(stringValue, out tmp))
{
return tmp >= Min && tmp <= Max;
}
return false;
}