Использование ASP.NET MVC ViewModels с Durandal без шаблонного кода

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

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


person motig88    schedule 06.05.2013    source источник


Ответы (1)


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

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

person nihique    schedule 06.05.2013