我正在写一个基于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
写一个“翻译”,这可能会很麻烦。
这是正确的方式,还是我将自己投入一个太深而无法离开的洞?
答案 0 :(得分:1)
如果您使用与John的HotTowel相同的架构,为什么不使用Breeze JS验证?您的模型将具有EF /数据库的基本验证规则,然后您可以使用自定义验证器进行增强。