asp.net – KnockoutJS,在ajax调用后更新ViewModel

我正在使用Knockout和Knockout Mapping插件.

>我的MVC3 Action返回一个View而不是JSON直接将我的Model转换成JSON.
>这是一个数据输入表单,由于系统验证的性质全部在服务层中完成,并在viewmodel中的Response对象中返回警告.
>初始的绑定和更新正确的工作正是导致我的问题的“后更新”行为.

我的问题是在调用AJAX POST之后,并且接收到我的JSON响应剔除没有更新我的所有绑定…好像可观察/映射已经掉下来

如果我添加一个额外的ko.applyBindings(viewmodel);在成功的事情做的工作…但是问题然后出现与多个绑定,并确定这不是正确的解决方案.

这是HTML / Template / Bindings

<!-- Start Form -->
<form action="@Url.Action("Edit")" data-bind="submit: save">
<div id="editListing" data-bind="template: 'editListingTemplate'"></div>
<div id="saveListing" class="end-actions">
    <button type="submit">Save Listings</button>
</div>
</form>
<!-- End Form -->

<!-- Templates -->
<script type="text/html" id="editListingTemplate">
        <div class="warning message error" data-bind="visible: Response.HasWarning">
            <span>Correct the Following to Save</span>
            <ul>
                {{each(i,warning) Response.BusinessWarnings}}
                    <li data-bind="text: Message"></li>
                {{/each}}
            </ul>
        </div>

        <fieldset>
            <legend>Key information</legend>
            <div class="editor-label">
                <label>Project Name</label>
            </div>
            <div class="editor-field">
                <input data-bind="value: Project_Name" class="title" />
            </div>            
        </fieldset>        
</script>
<!-- End templates -->

这是Knockout / Script

<script type="text/javascript">
        @{ var jsonData = new HtmlString(new JavaScriptSerializer().Serialize(Model)); }

        var initialData = @jsonData;
        var viewmodel = ko.mapping.fromJS(initialData);


        viewmodel.save = function () 
        {
            this.Response = null;
            var data = ko.toJSON(this);
            $.ajax({
                url: '@Url.Action("Edit")',contentType: 'application/json',type: "POST",data: data,dataType: 'json',success: function (result) {
                ko.mapping.updateFromJS(viewmodel,result);
            }
        });
    }

    $(function() {                        
        ko.applyBindings(viewmodel);            
    });
</script>

这是从成功请求(包括验证消息)返回的JSON响应.

{
    "Id": 440,"Project_Name": "","Response": {
        "HasWarning": true,"BusinessWarnings": [
            {
                "ExceptionType": 2,"Message": "Project is invalid."
            },{
                "ExceptionType": 1,"Message": "Project_Name may not be null"
            }
        ]
    }   
}

UPDATE

Fiddler Demo一个修剪现实的例子,我正在经历.我使用返回的JSON更新了Project_Name,但是没有通过它们的数据绑定来更新viewmodel.Response对象和属性.具体Response.HasWarning().

我已经改回到ko.mapping.updateFromJS,因为在我的控制器中,我专门返回Json(viewmodel).

清理我的初始代码/问题以匹配演示.

解决方法

我猜回应是保留的,当我将“回应”改为“resp”时,一切顺利.见 http://jsfiddle.net/BBzVm/

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...