半複雑なシナリオでサーバークライアントの検証ソリューションを完成させるのが苦労しています。 Iは、コアタイプは、DateRange
呼ばれています: Semi-Complex View Model ASP.NET MVC 3のプロパティ検証
public class DateRange {
public DateRange (DateTime? start, DateTime? end) { ... }
public DateTime? Start { get; private set; }
public DateTime? End { get; private set; }
}
は、私のようなビューモデルがあります:
public class MyViewModel {
public DateRange Period { get; set; }
}
をI%mvcproject%\ビュー\共有\ EditorTemplates \ DateRange.cshtmlのような持っている:
を@model MyCore.DateRange
@Html.Editor("Start", "Date")
@Html.Editor("End", "Date")
また、2つのフォーム入力をDateRange
プロパティにバインドするためのDateRangeModelBinder
があります。私がいる問題はDateRangeRequiredAttribute
である:
public class DateRangeRequired : ValidationAttribute, IClientValidatable,
IMetadataAware
{
private const string DefaultErrorMessage =
"{0} is required.";
public DateRangeRequired(bool endIsRequired = true)
: base(() => DefaultErrorMessage)
{
EndIsRequired = endIsRequired;
}
public bool EndIsRequired { get; set; }
public override bool IsValid(object value)
{
if (value == null)
{
return false;
}
if (!value.GetType().IsAssignableFrom(typeof(DateRange)))
{
throw new ArgumentException("Value is not a DateRange.");
}
var dateRange = value as DateRange;
return (dateRange.Start.HasValue && !EndIsRequired) ||
(dateRange.Start.HasValue && dateRange.End.HasValue && EndIsRequired);
}
public override string FormatErrorMessage(string name)
{
return string.Format(CultureInfo.CurrentCulture, ErrorMessageString, name);
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule()
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "daterangerequired"
};
rule.ValidationParameters.Add("endisrequired", EndIsRequired.ToString().ToLower());
yield return rule;
}
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.DataTypeName = "DateRange";
}
}
私はそれは2つの入力にフックすることができません。 Split入力のためにEditorTemplateとペアになるのはほぼValidatorTemplate
のようなものです。何か案は?追加の説明が必要な場合はお知らせください。
これはうまく見え、完了です。それは私が自分の属性を使ってやろうとしたことではありません。 DateRangeはビューモデルではなく、DateRangeプロパティを持つすべてのビューモデルで終了日が必要なわけではありません。私は、明確化のために私の属性コードを掲示します。 – gabe
@Darin、FluentValidation.NETのように。しかし、クライアント側の検証は不十分です。どのようにそれを拡張しますか? DataAnnotationベースのバリデーションは、コードが時々クレイジーであっても、拡張することができます。 –