やや複雑なシナリオでサーバーとクライアントの検証ソリューションを完成させるのに苦労しています。と呼ばれるコアタイプがありDateRange
ます:
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; }
}
次のような %mvcproject%\Views\Shared\EditorTemplates\DateRange.cshtml があります。
@model MyCore.DateRange
@Html.Editor("Start", "Date")
@Html.Editor("End", "Date")
DateRangeModelBinder
2 つのフォーム入力をDateRange
プロパティにバインドする必要もあります。私が抱えている問題は次の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つの入力に接続できません。ValidatorTemplate
入力が分割されているため、 EditorTemplate とペアになる が必要なようです。何か案は?追加の説明が必要な場合はお知らせください。