【问题标题】:Mapping issue between knockout's ViewModel and MVC's Model淘汰赛的 ViewModel 和 MVC 的 Model 之间的映射问题
【发布时间】:2013-10-24 17:58:35
【问题描述】:

这次遇到了客户端knockout.js的viewModel和服务端MVC的Model的映射问题。

所以重点是:

我有一个淘汰视图模型和其中的一些方法。

例如其中一个看起来像这样:

                    this.search = function () {
                            $.ajax({
                                url: "@Html.Raw(@Url.Action("Search"))",
                                    type: 'POST',
                                    beforeSend: function () {
                                    },
                                    complete: function () {
                                    },
                                    data: ko.toJSON(this),
                                    cache: false,
                                    contentType: false,
                                    processData: false,
                                    success: function (result) {
                                        alert(result);
                                    }
                                });
                    };

knockout viewModel 和 MVC 的 Model 字段相同,唯一的区别是每个字段的第一个字母:knockout 的字段以小写字母开头,MVC 的 Model 字段以大写字母开头,例如: someField - SomeField

因此,就我而言,我正在尝试使用上述搜索方法向服务器发布帖子。在这样做之前,我什至检查了 viewModel 是否有正确的数据,并且我成功地显示了 this.startDate() 但是当我将断点放在我的搜索操作的服务器端时,我可以看到我没有收到任何数据...... 这很奇怪。

最近我成功实现了一个使用knockout的项目,没有遇到这个问题。

我什至将 [Serializable] 放在服务器端 Model 的顶部,但没有结果。

请告知可能会对此产生什么影响,我该如何解决? 谢谢。

【问题讨论】:

    标签: asp.net-mvc jquery knockout.js model-binding


    【解决方案1】:

    MVC 模型绑定器区分大小写。调整其中一个模型以匹配另一个模型,或使用 KO 映射。

    【讨论】:

    • 但如果它区分大小写,那么它在我之前的项目中是如何工作的?以及为什么 MS 对淘汰赛的演示是在 someField-SomeField 上完成的(视频可在 youtube 上找到)?
    • 我必须检查一下,我发现模型绑定器对于正确匹配 POST 和方法签名/对象签名之间的大小写非常挑剔。不过,序列化标记属性是完成映射的一种方式。
    【解决方案2】:

    嗯,越来越奇怪了……

    我创建了测试淘汰 ViewModel(我在一个页面上使用了多个 VM):

                var testViewModel = function () {
                    this.Name = ko.observable("");
    
                    this.testsearch = function () {
    
                        $.ajax({
                            url: "@Html.Raw(@Url.Action("Test"))",
                                    type: 'POST',
                                    beforeSend: function () {
                                    },
                                    complete: function () {
                                    },
                                    data: ko.toJSON(this),
                                    cache: false,
                                    contentType: false,
                                    processData: false,
                                    success: function (result) {
                                        alert(result);
                                    }
                                });
                    };
                } 
    
      var testVM = new testViewModel();
      ko.applyBindings(testVM, $("#testSection")[0]);
    

    这是 HTML 部分: [section id="testSection" style="background-color: white;"] [输入数据绑定=“值:名称”/] [button type="button" class="btn btn-default" data-bind="click: testsearch"]测试[/button]

       [/section]
    

    这是我的服务器端模型: [可序列化] 公共类TestDataModel {

        public string Name { get; set; }
    }
    

    这是我的行动:

        public JsonResult Test(TestDataModel vm)
        {
            return Json("");
        }
    

    在我的行动中,我收到了 null... 我现在完全被困住了......

    【讨论】:

    • 还有一件事:当我调试时,我可以看到客户端发送带有数据的 json。但是为什么服务器端操作为空还不清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2013-11-01
    • 1970-01-01
    • 2012-09-05
    • 2013-05-27
    • 2012-10-03
    • 2012-06-08
    相关资源
    最近更新 更多