将 MVC 模型转换为 Knockout JS ViewModel

Posted

技术标签:

【中文标题】将 MVC 模型转换为 Knockout JS ViewModel【英文标题】:Converting MVC Model to Knockout JS ViewModel 【发布时间】:2015-03-29 03:43:31 【问题描述】:

我正在尝试在这里将我的 mvc 模型转换为淘汰视图模型:

型号

public class MyModel

    public int Id  get; set; 
    public string FirstName  get; set; 
    public string LastName  get; set; 
    .
    .
    .
    public List<MyList1> MyListOne get; set; 
    public List<MyList2> MyListTwo get; set;   

控制器

public ActionResult Index()

      MyModel myModel;

      var myServiceObject = myServiceManager.GetMyModelByUser(user);

      myModel = new MyModel
      
        Id = myServiceObject.Id,
        .
        . 
        .
        .
      ;

      return View(myModel);  

查看模型

var DynamicModelLoading = function (data) 
    var self = this;

    ko.mapping.fromJS(data, , self);

;

助手

public static string ToJson(this object obj)
        
            JsonSerializerSettings serializerSettings = new JsonSerializerSettings
            
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            ;

            return JsonConvert.SerializeObject(obj, Formatting.None, serializerSettings);
        

查看

<script src="~/Scripts/jquery-2.1.1.min.js"></script>
<script src="~/Scripts/knockout-3.2.0.js"></script>
<script src="~/Scripts/knockout.mapping-latest.js"></script>
<script type="text/javascript">
    var viewModel;

    $(function () 
            var viewModel = new DynamicModelLoading(@html.Raw(Model.ToJson()));            
            ko.applyBindings(viewModel);
   );
</script>

<div class="f_name" data-bind="text: FirstName"></div>
<div class="f_name" data-bind="text: LastName"></div>

ToJson() 返回数据。但是在绑定它时,我没有收到任何错误,也没有数据。我在这里遗漏了一些东西,但不确定它是什么。


回答

这里是修复:

<div class="f_name" data-bind="text: firstName"></div>
<div class="f_name" data-bind="text: lastName"></div>

我希望属性名称与我的 mvc 模型相同,但 Json Serializer 默认将大写的第一个字母转换为小写。

【问题讨论】:

希望这里有帮助***.com/questions/11628938/… 【参考方案1】:

问题一定与来自@Html.Raw(Model.ToJson()));的JSON结果有关

只是为了稍微修改一下代码,我创建了这个小提琴,它似乎正确地映射了数据,并成功地将它绑定到视图:http://jsfiddle.net/4Lu8fdx2/

这是 JavaScript 代码:

var DynamicModelLoading = function (data) 
    var self = this;

    ko.mapping.fromJS(data, , self);
;

$(function () 
    var viewModel = new DynamicModelLoading("testProperty":"testValue");

    ko.applyBindings(viewModel);
);

这成功地将传入“DynamicModelLoading()”的静态 JSON 绑定到视图中的 HTML。这是 HTML:

<h4>Value For 'testProperty'</h4>
<span data-bind="text: testProperty"></span>

在调用“applyBindings()”之前将 viewModel 记录到控制台会发生什么?它是否包含配置为可观察对象(函数)的原始 JSON 对象的所有属性?当我记录 viewModel 时,这就是我得到的:

DynamicModelLoading testProperty: function, __ko_mapping__: Object

如果映射成功,您应该会得到类似的结果,但包含对象的所有属性。

【讨论】:

没问题,希望对您有所帮助!【参考方案2】: 变量视图模型; $(函数() var viewModel = new DynamicModelLoading(JSON.parse('@Html.Raw(Json.Encode(Model))')); ko.applyBindings(viewModel); );

【讨论】:

以上是关于将 MVC 模型转换为 Knockout JS ViewModel的主要内容,如果未能解决你的问题,请参考以下文章

我可以在主视图的 Knockout 视图模型中使用 MVC 局部视图中的模型吗?

将 Knockout.js 与最新的 jQuery 文件和 ASP.NET MVC 一起使用

浅谈js中的MVC

简单谈谈js中的MVC

带有 HTML 到 PDF 转换器的 Knockout JS

我是不是有理由使用 Knockout MVC 而不是 Knockout JS?