2016-07-26 4 views
2

В настоящее время мы создаем пару полей ввода, которые будут содержать начало и конец datetime, по одному в каждом поле. У нас есть валидация в настоящее время, так что она выводит сообщение об ошибке, если пользователь ставит время начала после окончания времени (и наоборот) на время окончания до начала), однако мы столкнулись с интересной проблемой с этим.Проверка MVC - обновление другого поля?

Если пользователь, например, ставит конечное время до начала, мы получаем сообщение об ошибке в конечное время, как ожидалось.

enter image description here

Однако, если дата начала затем внесены изменения, в отличие от даты окончания, сообщение остается.

enter image description here

Есть ли способ, чтобы удалить обновления/исправления сообщения/проверки на другом поле? Вот код для проверки:

[Required(ErrorMessage = "{0} is required!")] 
[Display(Name = "Start Date")] 
[Remote("IsTestPlanEndCorrect", "Analysis", AdditionalFields = "EndDate", HttpMethod = "Post", ErrorMessage = "Test Plan Start Time must be before End.")] 
public System.DateTime StartDate { get; set; } 

[Required(ErrorMessage = "{0} is required!")] 
[Display(Name = "End Date")] 
[Remote("IsTestPlanEndCorrect", "Analysis", AdditionalFields = "StartDate", HttpMethod = "Post", ErrorMessage = "Test Plan End Time must be after Start.")] 
public System.DateTime EndDate { get; set; } 

IsTestPlanEndCorrect это просто метод, который возвращает истину или ложь в зависимости, если передаваемые данные проходят проверку.

EDIT: Бритва код для полей:

<div class="form-group"> 
@Html.LabelFor(t => t.StartDate, new { @class = "col-md-2 control-label" }) 
<div class="col-md-10"> 
     @Html.TextBoxFor(t => t.StartDate, new { @class = "form-control datetimepicker", placeholder = "Enter Test Plan Start"}) 
     @Html.ValidationMessageFor(t => t.StartDate) 
    </div> 
</div> 

<div class="form-group"> 
    @Html.LabelFor(t => t.EndDate, new { @class = "col-md-2 control-label" }) 
    <div class="col-md-10"> 
     @Html.TextBoxFor(t => t.EndDate, new { @class = "form-control datetimepicker", placeholder = "Enter Test Plan End"}) 
     @Html.ValidationMessageFor(t => t.EndDate) 
    </div> 
</div> 

код проверки в контроллере:

[HttpPost] 
public JsonResult IsTestPlanEndCorrect(DateTime EndDate, DateTime StartDate) 
{ 
    return Json(TimeManipulation.checkDate(StartDate,EndDate)); 
} 
+0

Что делает ваш код проверки 'IsTestPlanEndCorrect'? – Shyju

+0

'Анализ' - это имя контроллера, который имеет метод' IsTestPlanEndCorrect' – Novastorm

+0

Yea. Можете ли вы поделиться этим кодом? Когда вы удваиваете дату начала, делает ли это асинхронный вызов? – Shyju

ответ

1

Причиной поведения является то, что проверка на стороне клиента jquery инициируется для редактируемого элемента (первоначально на .blur() и после этого на .keyup()). Изменение значения в текстовом поле StartDate не вызывает проверки значения EndDate, оно только вызывает проверку значения StartDate, поэтому сообщение проверки не исчезает.

Вы могли бы решить эту проблему, в частности, вызвав .keyup() событие в «другой» текстовое поле, например

$('#StartDate').change(function() { 
    $('#EndDate').trigger('keyup'); // or $('#EndDate').valid(); 
}); 
$('#EndDate').change(function() { 
    $('#StartDate').trigger('keyup'); // or $('#StartDate').valid(); 
}); 

Однако с помощью RemoteAttribute для проверки значений, которые уже известны в клиенте это пустая трата ресурсов и вы будете делать минимум 2 звонка в вашу базу данных при каждом изменении значений. Кроме того, удаленная проверка только на стороне клиента, и вам нужно снова повторить логику проверки в методе POST и вручную добавить ModelStateError для защиты от злоумышленника.

Вместо этого используйте специальный атрибут проверки, который реализует IClientValidatable, так что вы получаете валидацию как на стороне клиента, так и на стороне сервера без необходимости аякс-вызовов. Для хорошего руководства по внедрению своих собственных, обратитесь к The Complete Guide To Validation In ASP.NET MVC 3 - Part 2. Или для готового решения, рассмотрите использование атрибутов проверки foolproof[GreaterThan] и [LessThan]. Обратите внимание, что обычно вы применяете одно или другое к одному из свойств, но если вы хотите применить его к обоим, например.

[LessThan("EndDate")] 
public DateTime StartDate { get; set; } 
[GreaterThan("StartDate")] 
public DateTime EndDate { get; set; } 

то вам еще нужно для запуска .keyup() события, упомянутые выше, чтобы сделать другое сообщение исчезнет.

0

Вы, вероятно, хотите/нужно добиться этого с jQuery:

$('#StartDate, #EndDate').change(function() { 
    $('#StartDate, #EndDate').valid(); 
}); 

Это приведет к тому, что валидация будет вызвана для оба поля каждый раз, когда есть изменение на Поле. Вероятно, вы захотите добавить некоторые дополнительные проверки в этот код, например, если конечная дата пуста, вы, вероятно, пока не хотите ее проверять.

+0

Знаете ли вы, можно ли вообще связать это с html-валидацией? Это решение выглядит идеально, но я не уверен, как связать его с фактическим сообщением о проверке – Novastorm

+0

@Novastorm Извинения, я тупой. Что ты имеешь в виду? Если у вас есть проверка jQuery на лицевой стороне (предположительно, вы делаете это из-за удаленной проверки), тогда это должно быть хорошо и делать это автоматически. – ediblecode

+0

Итак, сообщение о проверке, которое вы видите в пользовательском интерфейсе, поступает из нашего ViewModel (который является первым фрагментом кода в сообщении). Я думаю, что удаленный используется для определения того, что проверка выполняется стороной приложения, а не стороной клиента (так как этот метод попадает в точку останова и отлаживается в коде). Когда я говорю ссылку, вернусь к проверке html, я имею в виду сообщение, которое вы получаете в пользовательском интерфейсе (плохой выбор работы с моей стороны там!) – Novastorm

Смежные вопросы