我使用ASP WebAPI和knockoutJS进行单页应用。
现在,我有webfrontend和knockoutJS视图模型。另外,我有一个SQL数据库(模型)。
现在我想将模型数据放入前端。我不知道最好的方法是什么。 当然,我可以将模型序列化为JSON。我知道ko.mapping-plugin以及Razor序列化机制。
我的问题是:我的模型与viewmodel完全不同。我需要转换机制或其他东西。
示例模型:
示例viewmodel:
{姓名:'德国',城市:['柏林','纽伦堡','科隆']}
因此,模型会保存所有可用的国家/地区+城市,前端只显示一个国家/地区的城市。
我不正在寻找算法。我正在寻找"最好的方法来做到这一点"。转换器是控制器的一部分吗?我是否需要一个c#类用于viewmodel(然后序列化它)?
有人能指出我一个好的设计模式/教程/示例项目吗?
THX!
答案 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);
}
});
}