我正在寫一個基於約翰帕帕的「熱毛巾」模板,意思是MVC 4和Durandal的小應用程序。作爲主要MVC經驗的人,使用MVC的「模型」和他們的數據註釋進行驗證似乎是最「正確的」。 我也不想寫視圖模型或驗證兩次,這似乎是一個足夠合理的願望。使用ASP.NET MVC ViewModels與Durandal沒有樣板
到目前爲止,我很容易理解如何使用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: '[email protected]' }
我得到一個兩平整的物體,像
{ Email: { value : '[email protected]', required: true, displayName: 'e-mail' } }
,然後用KO的結合是這樣的:
<label data-bind="text: post.Email.displayName"></label>
<input type="text" data-bind=" value: post.Email.value" />
Thi當然意味着爲我想要使用的每一個單獨的DataAnnotation
寫一個「翻譯」,這會變得麻煩。
那麼這是正確的方法,還是我將自己陷入太深而無法擺脫的陷阱?