我正在编写一个基于 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
这当然意味着为我希望使用的每个单曲编写一个“翻译” ,这会变得很麻烦。
那么这是正确的方法还是我将自己投入到一个太深而无法摆脱的洞中?