文字列型の 4 つのプロパティを持つモデルがあります。StringLength アノテーションを使用して、単一のプロパティの長さを検証できることは知っています。ただし、4 つのプロパティを組み合わせた長さを検証したいと考えています。
データ注釈でこれを行う MVC の方法は何ですか?
私はMVCが初めてで、独自のソリューションを作成する前に正しい方法でやりたいので、これを求めています。
文字列型の 4 つのプロパティを持つモデルがあります。StringLength アノテーションを使用して、単一のプロパティの長さを検証できることは知っています。ただし、4 つのプロパティを組み合わせた長さを検証したいと考えています。
データ注釈でこれを行う MVC の方法は何ですか?
私はMVCが初めてで、独自のソリューションを作成する前に正しい方法でやりたいので、これを求めています。
カスタム検証属性を書くことができます:
public class CombinedMinLengthAttribute: ValidationAttribute
{
public CombinedMinLengthAttribute(int minLength, params string[] propertyNames)
{
this.PropertyNames = propertyNames;
this.MinLength = minLength;
}
public string[] PropertyNames { get; private set; }
public int MinLength { get; private set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var properties = this.PropertyNames.Select(validationContext.ObjectType.GetProperty);
var values = properties.Select(p => p.GetValue(validationContext.ObjectInstance, null)).OfType<string>();
var totalLength = values.Sum(x => x.Length) + Convert.ToString(value).Length;
if (totalLength < this.MinLength)
{
return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
}
return null;
}
}
次に、ビュー モデルがあり、そのプロパティの 1 つをそれで装飾する場合があります。
public class MyViewModel
{
[CombinedMinLength(20, "Bar", "Baz", ErrorMessage = "The combined minimum length of the Foo, Bar and Baz properties should be longer than 20")]
public string Foo { get; set; }
public string Bar { get; set; }
public string Baz { get; set; }
}
ExpressioniveAnnotationsは、次のような可能性を提供します。
[Required]
[AssertThat("Length(FieldA) + Length(FieldB) + Length(FieldC) + Length(FieldD) > 50")]
public string FieldA { get; set; }
答えるのが少し遅れましたが、誰が探しているのですか。データ注釈で追加のプロパティを使用することで、これを簡単に行うことができます。
public string foo { get; set; }
public string bar { get; set; }
[MinLength(20, ErrorMessage = "too short")]
public string foobar
{
get
{
return foo + bar;
}
}
本当にそれだけです。特定の場所に検証エラーも表示したい場合は、これをビューに追加できます。
@Html.ValidationMessage("foobar", "your combined text is too short")
ビューでこれを行うと、ローカライズを行う場合に便利です。
お役に立てれば!