Я пишу небольшое приложение на основе шаблона «Горячее полотенце» Джона Папы, то есть MVC 4 и Durandal. Как человеку, имеющему в основном опыт работы с MVC, кажется наиболее «правильным» использовать «Модели» MVC с их аннотациями данных для проверки. Я также не хочу дважды писать модели представления ИЛИ валидацию, что кажется достаточно разумным желанием.
До сих пор я легко понял, как использовать ko.mapping
для загрузки ViewModel и ее данных со стороны сервера с помощью JSON и привязки к ней моей формы. Отлично. Но как насчет части проверки? На всю жизнь я не могу найти ни одного решения для этого в Интернете, так как я не заинтересован в использовании Razor (я видел некоторые решения, использующие его HtmlHelpers
).
На данный момент лучший способ, который я вижу, — преобразовать объекты ViewModel на сервере в более простой объект JSON с использованием отражения, где эти аннотации будут представлены как члены. Вот так:
public object TransformVM(object vm)
{
var properties = vm.GetType().GetProperties();
var result = new Dictionary<string,object>();
foreach (var p in properties)
{
var attributes = p.GetCustomAttributes(true);
var displayName = attributes.FirstOrDefault(a => a is DisplayNameAttribute) as DisplayNameAttribute;
result.Add(p.Name, new
{
value = p.GetValue(vm),
displayName = displayName != null ? displayName.DisplayName : ""
});
}
return result;
}
это означает, что вместо получения модели представления в качестве этого json
{ Email: 'something@somewhat' }
Я получаю двухуровневый объект, например
{ Email: { value : 'something@somewhat', required: true, displayName: 'e-mail' } }
а затем с помощью привязки ko следующим образом:
<label data-bind="text: post.Email.displayName"></label>
<input type="text" data-bind=" value: post.Email.value" />
Это, конечно, означает написание «перевода» для каждого отдельного DataAnnotation
, который я хочу использовать, что может стать громоздким.
Так это правильный путь или я загоняю себя в яму слишком глубокую, чтобы выбраться из нее?