Я создаю SPA с Angular. Серверная часть представляет собой сервер ASP.NET MVC WebApi. Модель сохраняется с помощью Entity Framework. Breeze получает метаданные, предлагаемые Entity Framework, и передает их в приложение SPA в браузере.
В одной форме я использую Kendo DatePicker. Он настроен с немецким форматом даты ("дд.ММ.гггг"). Я также аннотировал входной тег атрибутом data-z-validate.
Когда кто-то вводит недопустимую строку даты, я хочу видеть красную подсказку с предупреждением и сообщением об ошибке проверки. К сожалению, этого не происходит. Еще хуже кажется, что проверка вообще не выполняется.
Нужно ли добавлять собственный валидатор на стороне клиента? Если да, то как мне это сделать?
Угловой вид:
<input kendo-date-picker id="aktion-termin" type="text" placeholder="Termin"
k-ng-model="vm.aktion.termin" k-format="'dd.MM.yyyy'"
data-z-validate />
Класс модели:
public class Aktion
{
...
[DataType(DataType.Date)]
public DateTime? Termin { get; set; }
...
}
Метаданные:
"entityType":[
{
"name":"Aktion",
...
"property":[
...
{
"name":"Termin",
"type":"Edm.DateTime"
},
...
],
...
}
Дополнительная информация
В той же форме есть еще одно обязательное поле. Здесь проверка работает хорошо. Всплывающее окно с ошибкой проверки появляется, когда я оставляю поле пустым. Так что вся инфраструктура работает в целом. Но это стандартное поле ввода. Никакого кендо.
<input class="form-control" id="aktion-titel" placeholder="Name"
data-ng-model="vm.aktion.titel" data-z-validate />
Упомянутое поле даты также функционально. Когда я ввожу допустимую строку даты в соответствии с заданным форматом (например, «02.01.2015»), я вижу правильное значение в базе данных после команды сохранения. Я также могу видеть вставленную дату в JSON, который Breeze отправляет на сервер. Все работает правильно, пока вставленная строка даты соответствует заданному формату даты.
{
"$id":"1",
"$type":"Breeze.ContextProvider.SaveResult, Breeze.ContextProvider",
"Entities":[
{
"$id":"2",
"$type":"Aktionen.Model.Aktion, Aktionen.Model",
"Id":"a0b2639a-c79b-46ef-a5ee-6982dcbe1782",
"Titel":"abc",
"Termin":"2015-01-02T00:00:00.000+01:00", // <----- ok
...
},
...
],
"KeyMappings":[
],
"Errors":null
}
Когда я ввожу мусор (например, «xyz»), на сервер отправляется нулевое значение. И ноль - это то, что я вижу в базе данных.
{
"$id":"1",
"$type":"Breeze.ContextProvider.SaveResult, Breeze.ContextProvider",
"Entities":[
{
"$id":"2",
"$type":"Aktionen.Model.Aktion, Aktionen.Model",
"Id":"736f976c-9e3b-42ee-90a9-ca421b6c2843",
"Titel":"The Name",
"Termin":null, // <------ bad
...
},
...
],
"KeyMappings":[
],
"Errors":null
}
Это не совсем то поведение, которое я имел в виду. Приложение должно информировать пользователя о недопустимой дате, показывая всплывающее окно проверки. И он не должен принимать запись и не должен отправлять ее на сервер.
Когда я обхожу средство выбора даты кендо, программно устанавливая строку даты, я получаю ошибку проверки от Breeze: «'termin' должна быть датой».
function save() {
if (vm.isSaving) { return common.$q.when(null); }
if (!canSave()) { return common.$q.when(null); }
vm.aktion.termin = "xyz"; // <--------- rubbish
vm.isSaving = true;
return datacontext.save().then(function() {
vm.isSaving = false;
}, function () {
vm.isSaving = false;
});
}
Когда я отлаживаю эту функцию, я вижу значения свойства vm.aktion.termin:
"01.01.2015" --> Чт, 01 января 2015 г., 00:00:00 GMT+0100 (Mitteleuropäische Zeit)
"xzy" --> ноль
Учитывая этот вывод, я предполагаю, что средство выбора даты кендо выдает строку даты только тогда, когда ввод действителен.