MVC 4 と Durandal を意味する John Papa の「ホット タオル」テンプレートに基づいて小さなアプリを作成しています。ほとんどが MVC の経験を持つ人として、MVC の「モデル」を検証用のデータ注釈とともに使用するのが最も「正しい」と思われます。また、ビューモデルまたは検証を2回書きたくありません。これは、十分に合理的な欲求のようです。
これまでのところ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' }
次のような2レベルのオブジェクトを取得します
{ 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
もちろん、これは、使用したいすべての単一の「翻訳」を書くことを意味し、面倒になる可能性があります.
それで、これは正しい方法ですか、それとも、抜け出すには深すぎる穴に自分自身を投げ込んでいますか?