0

Я пишу небольшое приложение на основе шаблона «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. Я хочу использовать, что может стать громоздким.

Так это правильно, или я качаю себя в отверстие слишком глубоко, чтобы выбраться из?

ответ

1

Если вы собираетесь использовать ту же архитектуру, что и HotTowel от John, почему бы не использовать валидации Breeze JS? Ваша модель будет иметь основные правила проверки из EF/database, а затем вы можете улучшить использование пользовательских валидаторов.

Подробнее читайте здесь: http://www.breezejs.com/documentation/validation