2013-11-04 43 views
2

我正在構建一個ASP.NET MVC應用程序,它利用使用AutoMapper的ViewModels。但是,我正在考慮將KnockoutJS用於「AJAX重」頁面,但這意味着我還必須爲KnockoutJS創建ViewModels。ViewModels和KnockoutJS

我認爲有兩個獨立的ViewModel的主要缺點是可維護性。有沒有比創建兩個ViewModel更好的解決方案?另外,閱讀其他一些帖子,這意味着客戶端ViewModel必須知道服務器端是不好的做法,並將兩者緊密結合在一起。

我必須承認我還沒有真正使用KnockoutJS過去,但讀/經歷了一些教程,所以我在這個問題上有點無關。任何幫助,將不勝感激。

+0

爲什麼你認爲你目前的ViewModels不能與KnockoutJS一起使用? – haim770

+0

我以爲我必須爲ASP.NET MVC創建一個ViewModel,而且還需要在JS中爲KnockoutJS創建一個ViewModel?但正如下面的@twoflower建議,我可以刪除這種重複。 – teh0wner

+0

實際上,當你使用KO時,你實際上經常不需要MVC視圖模型,你可以直接使用域實體 – Anders

回答

3

口是心非可以在很大程度上通過以下方法降低:

@model ViewModel 

<script src="@Url.Content("~/Scripts/knockout.mapping-latest.js")" type="text/javascript"></script> 

... 

<script type="text/javascript"> 
    function ViewModel(initData) { 
     var self = this; 
     ko.mapping.fromJS(initData, {}, self); 

     // Add custom view model logic 
     ... 

     // Logic for persisting the current state of the model back to the server 
     self.Save = function() {     
      $.ajax('/model-uri', { 
       type: 'POST', 
       contentType: "application/json", 
       data: ko.toJSON(self)     
     }); 
    }; 

    var initialData = @(Html.Raw(JsonConvert.SerializeObject(Model))); 
    var model = new ViewModel(initialData); 
    ko.applyBindings(model); 
</script> 

請注意,我們序列化服務器提供的視圖模型爲JavaScript對象,然後使得其性能可觀察到的使用ko.mapping插件,它可以節省我們在客戶端複製視圖模型定義。在將更新的模型發送回服務器時,我們還使用ko.toJSON實用程序功能。

+0

感謝您的支持!我一回家就會嘗試一下。但是,ASP.NET ViewModels的數據屬性和驗證會發生什麼? – teh0wner

+0

如果您收到客戶端發送的數據作爲您的服務器端ViewModel對象,則服務器端驗證將起作用。 – twoflower

+0

我認爲使用KO時客戶端驗證不起作用,因此我必須在自定義視圖模型邏輯中實現該功能。也許可以使用諸如Knockout Validation之類的框架? 如果我得到了這個正確的看起來像這樣︰ //添加自定義視圖模型邏輯: personName:ko.observable(initData.PersonName).extend({required:true}); – teh0wner