Хорошо, вот хак, который работает для меня в этом случае.Сначала я должен признать, что я не знал, что аргумент в IsValidDate должен быть назван так же, как поле, которое я хочу проверить.Теперь я это знаю.
Вот измененный код:
public class ValidationController : Controller
{
public JsonResult IsValidDate(string date)
{
if (date == null)
date = GetQueryStringValue("date");
bool isValid = DateHelper.IsValid(date);
if (isValid)
{
return Json(true, JsonRequestBehavior.AllowGet);
}
else
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
private string GetQueryStringValue(string key)
{
return (from qStr in Request.QueryString.AllKeys
where qStr.ToLower().EndsWith(key.ToLower())
select Request.QueryString.Get(qStr)).FirstOrDefault();
}
}
Обратите внимание, что я создал отдельный GetQueryStringValue, поэтому другие валидаторы могут использовать тот же метод.
Класс My Book теперь выглядит следующим образом (здесь упоминаются только проблемные поля):
public class Book
{
[Remote("IsValidDate", "Validation", ErrorMessage = "Release date is not valid")]
public DateTime ReleaseDate { get; set; }
[Remote("IsValidDate", "Validation", ErrorMessage = "Start date is not valid")]
public DateTime StartDate { get; set; }
}
Комментарий к решению: в основном я начинаю проверять, является ли аргумент в IsValidDate нулевым или нет.Если оно равно null, я просматриваю все ключи QueryString, чтобы увидеть, есть ли аргумент, заканчивающийся желаемым именем поля, и затем заполняю свой аргумент этим значением.
Это привело меня к другому решению (которое ТОЛЬКОработает здесь, потому что я знаю, что у меня нет дополнительных полей, которые заканчиваются тем же именем поля (или я должен сказать - частично имя поля).Говоря, что я хочу посмотреть только на частично ключевое имя «date» (вместо «releaseate»), я могу заставить этот валидатор проверять все мои поля даты в представлении.Но, как уже упоминалось: это работает только потому, что я не хочу дополнительные поля в моей удаленной проверки.Если бы я захотел сравнить, например, «StartDate» с «ReleaseDate», у меня возникли бы проблемы: -)
Я также переместил свое ErrorMessage в свои DataAnnotations, чтобы у меня могли быть разные сообщения об ошибках в полях.
Это не приятно - но это работает!