最佳实践:将模型转换为json viewmodel

时间:2014-10-02 13:55:30

标签: c# asp.net-mvc mvvm knockout.js asp.net-web-api

我使用ASP WebAPI和knockoutJS进行单页应用。

现在,我有webfrontend和knockoutJS视图模型。另外,我有一个SQL数据库(模型)。

现在我想将模型数据放入前端。我不知道最好的方法是什么。 当然,我可以将模型序列化为JSON。我知道ko.mapping-plugin以及Razor序列化机制。

我的问题是:我的模型与viewmodel完全不同。我需要转换机制或其他东西。

示例模型:

  1. 表:国家/通讯:ID,姓名
  2. 表:CitiesInCountry / Cols:ID,Name,CountryID
  3. 示例viewmodel:

    {姓名:'德国',城市:['柏林','纽伦堡','科隆']}

    因此,模型会保存所有可用的国家/地区+城市,前端只显示一个国家/地区的城市。

    正在寻找算法。我正在寻找"最好的方法来做到这一点"。转换器是控制器的一部分吗?我是否需要一个c#类用于viewmodel(然后序列化它)?

    有人能指出我一个好的设计模式/教程/示例项目吗?

    THX!

2 个答案:

答案 0 :(得分:0)

在服务器端进行所有transforamtions,留下前端只是渲染和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
        });    
}

答案 1 :(得分:0)

  

转换器是控制器的一部分吗?我需要一个c#类吗?   对于viewmodel(然后序列化)?

是的,您需要以这种方式创建ViewModel -

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

然后您将使用此类来制定实现。然后最后使用Json Serialization发送它。

  [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);
         }
     });
 }