0

我正在寫一個基於約翰帕帕的「熱毛巾」模板,意思是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寫一個「翻譯」,這會變得麻煩。

那麼這是正確的方法,還是我將自己陷入太深而無法擺脫的陷阱?

回答

1

如果你打算使用與John的HotTowel相同的架構,爲什麼不使用Breeze JS驗證?您的模型將具有EF /數據庫的基本驗證規則,然後您可以使用自定義驗證程序進行增強。

瞭解更多:http://www.breezejs.com/documentation/validation