Я пишу небольшое приложение на основе шаблона «Hot Towel» Джона Папы, что означает MVC 4 и Durandal. Как человек с опытом MVC, кажется наиболее «правильным» использовать «Модели» MVC с их аннотациями данных для проверки. Я также не хочу писать модели просмотра или проверку дважды, что кажется достаточно разумным желанием.Использование ASP.NET MVC ViewModels с Durandal без шаблона
До сих пор я легко понял, как использовать 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: '[email protected]' }
я двухуровневый объект как
{ Email: { value : '[email protected]', required: true, displayName: 'e-mail' } }
, а затем с помощью нокаутов связывания следующим образом:
<label data-bind="text: post.Email.displayName"></label>
<input type="text" data-bind=" value: post.Email.value" />
Thi s, конечно, означает написание «перевода» для каждого DataAnnotation
. Я хочу использовать, что может стать громоздким.
Так это правильно, или я качаю себя в отверстие слишком глубоко, чтобы выбраться из?