2014-10-02 42 views
0

我正在對單頁應用程序使用ASP WebAPI和knockoutJS。最佳實踐:將模型轉換爲json viewmodel

現在,我有webfrontend和knockoutJS viewmodel。另外,我有一個SQL數據庫(模型)。

現在我想把模型數據放到前端。我不知道最好的辦法是什麼。 當然,我可以將模型序列化爲JSON。我知道ko.mapping-plugin和Razor序列化機制。

我的問題是:我的模型與viewmodel完全不同。我需要一個轉換機制或其他東西。

示例模型:

  1. 表:國家/列數:ID,名稱
  2. 表:CitiesInCountry /列數:ID,名稱,CountryID

示例視圖模型:

{名稱:'德國',城市:['柏林','紐倫堡','科隆']}

所以模式l保存所有可用的國家+城市,前端只顯示一個國家和城市。

我是不是尋找算法。我正在尋找「做到這一點的最佳方式」。控制器的轉換部分是什麼?我需要一個C#類的視圖模型(然後序列化)?

有人能指點我一個好的設計模式/教程/示例項目嗎?

thx!

回答

0

是對控制器的轉換部分?我需要一個C#類 爲viewmodel(然後序列化它)?

YES,你需要以這種方式創建視圖模型 -

public class CountryViewModel 
{ 
    public string Name { get; set; } 
    public List<string> Cities { get; set; } 
} 

然後你要使用這個類來制定實施。然後使用Json序列化最終發送它。

[HttpGet] 
    public JsonResult GetDate() 
    { 
     var model = new CountryViewModel(); 
     // Get data from Database and Initialize/map it to model here or create list<CountryViewModel> 
     return Json(model, JsonRequestBehavior.AllowGet); 
    } 

在客戶端使用這種代碼 -

// Get data from server 
var getFilteredData = function() { 
    $.ajax({ 
     type: "GET", 
     url: "/URL/GetData", 
     contentType: "application/json; charset=utf-8", 
     success: function (data) {        
        self.KOObservableVariable(data); 
     }, 
     failure: function (errMsg) { 
        alert(errMsg); 
     } 
    }); 
} 
0

在服務器端執行所有傳輸,只爲前端渲染和UI事件。 您可以創建一些業務邏輯層,其中所有轉換和web-api控制器都會返回完整結果。

在客戶端,它只是收到結果並儘可能採取最低限度的措施。

實施例:

public class DBTable 
{ 
    public int Id {get; set;} 
    public string Param1 {get; set;} 
    // and others 
} 

public class ViewModelClass 
{ 
    public string CustomParam1 {get; set;} 
    // and so on 
} 

//in web-api controller 
public ViewModelClass GetData() 
{ 
    return new BLL.Data().GetData(); 
} 

// in BLL namespace Data class 
public class Data() 
{ 
    //DAL - data access layer - implement it as you would like. 
    var ViewModelClass result = new DAL.DataDAO().GetData() 
     .ConvertAll(x=> new ViewModelClass() { 
      // do all your transformation here 
      CustomParam1 = x.Param1, 
      // and other 
     });  
} 
+0

混凝土,這意味着我需要我的JSON - 視圖模型的POCO的表示?所以我實現了一個c#-viewmodel - >用模型中的數據填充它(包括轉換) - >序列化它 - >將它發送到前端? – user3796786 2014-10-02 14:36:33

+0

@ user3796786增加了一些例子 – aleha 2014-10-02 15:17:00

+0

thx,兩個答案都是正確的。兩者都幫助了我很多!我個人更喜歡其他答案,所以我選擇這個作爲正確答案。 – user3796786 2014-10-07 10:12:59