C# 如何向模型字段添加附加验证?
我还有第二件事:C# 如何向模型字段添加附加验证?,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,我还有第二件事: <td> @Html.LabelFor(m => m.Number, titleHtmlAttrs) </td> <td> <span class="element-value2"> @Html.EditorFor(m => m.Number) @Html.ValidationTooltipFor(m => m.Number) </span> &
<td>
@Html.LabelFor(m => m.Number, titleHtmlAttrs)
</td>
<td>
<span class="element-value2">
@Html.EditorFor(m => m.Number)
@Html.ValidationTooltipFor(m => m.Number)
</span>
</td>
这意味着如果我想改变这个字段,我可以有从空到20的任意值。
没关系,但现在我需要一个额外的验证。
在模型中,我有一些字段:
public DateTime? TimeOf { get; set; }
public bool HasType { get; set; }
只有当TimeOf不为null且HasType为true时,新的验证才能工作。新的验证应防止数字中出现空值。基本上,将(从空到20)更改为(从1到20)
我怎样才能正确地做到这一点
p.很抱歉我的英语不好。对于复杂的验证逻辑,请查看在
视图模型中的实现,然后您可以将条件验证逻辑放在验证
方法中。(注意,这显然是服务器端)
公共IEnumerable验证(ValidationContext ValidationContext)
{
if(this.HasType)
{
//进行其他条件验证
如果(验证失败)
{
返回新的ValidationResult(“此处出现描述性错误”);
}
}
//这里还有其他验证。
更新我似乎误解了这个问题。正如另一个答案已经指出的,您可以实现IValidatableObject来实现这一点。类似于:
在TimeOf上,您可以使用必需的属性来确保其具有值:
[Required(ErrorMessage="Must have value")]
public DateTime? TimeOf {get;set;}
并在其他两个上使用自定义属性:
[SomeCustomValidator(ErrorMessage="Error msg...")]
public string Number {get;set;}
[IsTrueAttribute(ErrorMessage="Must be true")]
public bool HasType {get;set;}
查看
[RequiredIfTrue]
和[RequiredIfNotEmpty]
验证属性您误解了这个问题。OP希望根据其他属性的值需要编号。而您的某个CustomValidator
的功能与[StringLength]完全相同
没有,但没有客户端验证
public class YourModelName : IValidatableObject
{
[StringLength(20)]
public string Number{ get; set; }
[Required]
public DateTime? TimeOf { get; set; }
public bool HasType { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
if (TimeOf != null && HasType)
Validator.TryValidateProperty(this.Number,
new ValidationContext(this, null, null) { MemberName = "Number" },
results);
if (TimeOf == null)
results.Add(new ValidationResult("Date Time must have a value"));
if (!HasType)
results.Add(new ValidationResult("Must be true"));
return results;
}
public class SomeCustomValidator : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
string number = value as string;
if (value == null) throw new InvalidOperationException("Can only be used on string properties");
if (!value.IsEmpty && value.Length <= 20)
{
return ValidationResult.Success;
}
return new ValidationResult("Name must be a non-empty string smaller than 20 chars"));
}
}
public class IsTrueAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value == null) return false;
if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");
return (bool) value == true;
}
}
[Required(ErrorMessage="Must have value")]
public DateTime? TimeOf {get;set;}
[SomeCustomValidator(ErrorMessage="Error msg...")]
public string Number {get;set;}
[IsTrueAttribute(ErrorMessage="Must be true")]
public bool HasType {get;set;}