Я обнаружил проблемы с аннотацией [Range(typeof(DateTime)]
и описал бы ее как "в лучшем случае неуклюжую", слишком большую вероятность, если она сработает.
Дистанционная проверка, кажется, является хорошим способом: избегать JavaScript в представлениях и поддерживать целостность кода на стороне сервера, лично никогда не нравится отправка кода клиенту для выполнения, если я могу избежать этого.
Использование @StackThis ответа в качестве основы и ссылки на статью по удаленной проверке в MVC3
Модель
public class SomeDateModel
{
public int MinYears = 18;
public int MaxYears = 110;
[Display(Name = "Date of birth", Prompt = "e.g. 01/01/1900")]
[Remote(action: "ValidateDateBetweenYearsFromNow", controller: "Validation", areaReference: AreaReference.UseRoot, AdditionalFields = "MinYears,MaxYears", HttpMethod = "GET" ,ErrorMessage = "Subject must be over 18")]
public DateTime? DOB { get; set; }
}
Контроллер - Развернут в корневом каталоге
namespace Controllers
{
public class ValidationController : Controller
{
[HttpGet]
[ActionName("ValidateDateBetweenYearsFromNow")]
public JsonResult ValidateDateBetweenYearsFromNow_Get()
{
//This method expects 3 parameters, they're anonymously declared through the Request Querystring,
//Ensure the order of params is:
//[0] DateTime
//[1] Int Minmum Years Ago e.g. for 18 years from today this would be 18
//[2] int Maximum Years Ago e.g. for 100 years from today this would be 100
var msg = string.Format("An error occured checking the Date field validity");
try
{
int MinYears = int.Parse(Request.QueryString[1]);
int MaxYears = int.Parse(Request.QueryString[2]);
//Use (0 - x) to invert the positive int to a negative.
var min = DateTime.Now.AddYears((0-MinYears));
var max = DateTime.Now.AddYears((0-MaxYears));
//reset the response error msg now all parsing and assignmenst succeeded.
msg = string.Format("Please enter a value between {0:dd/MM/yyyy} and {1:dd/MM/yyyy}", max, min);
var date = DateTime.Parse(Request.QueryString[0]);
if (date > min || date < max)
//switch the return value here from "msg" to "false" as a bool to use the MODEL error message
return Json(msg, JsonRequestBehavior.AllowGet);
else
return Json(true, JsonRequestBehavior.AllowGet);
}
catch (Exception)
{
return Json(msg, JsonRequestBehavior.AllowGet);
}
}
}
}
Переменная msg
отображается как часть вспомогательного средства проверки ValidationSummary или вспомогательного средства проверки ValidationFor (x => x.DATETIME)
View
Важно отметить, что поля, переданные как параметры 2 и 3, должны существовать в представлении, чтобы удаленная проверка могла передать значения в контроллер:
@Html.EditorFor(m => m.DOB)
@Html.HiddenFor(m => m.MinYears)
@Html.HiddenFor(m => m.MaxYears)
@Html.ValidationSummary()
Модель и помощники HTML сделают всю работу за вас.