【问题标题】:Using ASP.NET MVC ViewModels with Durandal without boilerplate将 ASP.NET MVC ViewModels 与 Durandal 一起使用,无需样板
【发布时间】:2013-04-30 09:04:30
【问题描述】:

我正在编写一个基于 John Papa 的“热毛巾”模板的小应用程序,即 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 编写一个“翻译”,这会变得很麻烦。

那么这是正确的方法还是我将自己投入了一个太深而无法摆脱的洞?

【问题讨论】:

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


    【解决方案1】:

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

    在这里阅读更多:http://www.breezejs.com/documentation/validation

    【讨论】:

      猜你喜欢
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 2010-09-09
      • 2011-06-26
      相关资源
      最近更新 更多