使用ASP.NET MVC ViewModels与Durandal没有样板

时间:2013-05-06 15:05:08

标签: validation asp.net-mvc-4 knockout.js knockout-mapping-plugin durandal

我正在写一个基于John Papa的“Hot Towel”模板的小应用程序,意思是MVC 4和Durandal。 作为具有MVC经验的人,使用MVC的“模型”及其数据注释进行验证似乎是“最正确的”。 我也不想写视图模型或验证两次,这似乎是一个合理的愿望。

到目前为止,我已经很容易想出如何使用ko.mapping使用JSON从服务器端加载ViewModel及其数据,并将我的表单绑定到它。大。但验证部分呢?对于我的生活,我无法在互联网上找到一个解决方案,因为我对使用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写一个“翻译”,这可能会很麻烦。

这是正确的方式,还是我将自己投入一个太深而无法离开的洞?

1 个答案:

答案 0 :(得分:1)

如果您使用与John的HotTowel相同的架构,为什么不使用Breeze JS验证?您的模型将具有EF /数据库的基本验证规则,然后您可以使用自定义验证器进行增强。

在此处阅读更多内容:http://www.breezejs.com/documentation/validation