Как выполнить валидацию Knockout на сложных моделях MVC декларативным способом?
Технически у меня есть ответ на этот вопрос, но, к сожалению, не тот ответ, который я искал. Я должен был принять это, потому что человек работал со мной все время, вкладывая много усилий. Здесь я прошу того же qn, чтобы получить конкретный ответ, который мне нужен:
Что мне нужно, так это декларативный способ выражения проверок на полях модели в модели представления Knockout:
Имея эту модель просмотра MVC:
public class Email
{
public string Selected { get; set; }
public string Name { get; set; }
}
public class User
{
public string UserName { get; set; }
public IList<Email> Emails { get; set; }
}
и имея этот нокаут viewModel
:
var viewModel = {
UserName: ko.observable("@Model.UserName"),
Emails: ko.observableArray(@Html.Json(@Model.Emails) || []),
// How to express these: ???
// Email.Selected: ko.observable().extend({ required: true })
// Email.Name: ko.observable().extend({ required: true, email: true })
}
какие изменения мне нужно сделать в нокауте viewModel
декларативно выразить это. По сути это сводится к выражению нокаута viewModel
аналогично MVC, но с использованием валидации (вместо аннотаций данных MVC) в полях этой модели.
Прежде чем ответить, пожалуйста, прочитайте до конца, текст читается не сильно, но я ищу что-то конкретное здесь.
1 ответ
Я хотел бы иметь модель представления электронной почты,
var Email =
{
Selected: ko.observable().extend({ required: true }),
Name: ko.observable().extend({ required: true, email: true })
}
а затем используйте плагин сопоставления, чтобы автоматически заполнить его для вас:
var viewModel = function()
{
var self = this;
self.UserName: ko.observable("@Model.UserName");
var mapping = {
'Emails': {
create: function(options) {
return new Email(options.data);
}
}
self.Emails= ko.mapping.fromJSON(@Html.Json(@Model.Emails), mapping);
}
Обратите внимание, что я думаю, что вам нужно сделать вашу модель представления функцией, а не прямым объектом JS, так как я не думаю, что это будет работать иначе.