在UpdatePanel中回发后的Knockout绑定

时间:2014-10-22 17:16:06

标签: javascript asp.net knockout.js webforms

我有一个带有表的页面,在UpdatePanel中绑定了Knockout。我的目标是在回发后成功应用绑定。在初始页面加载时,一切都按预期工作,因此模型正在运行。

我使用pageLoad()调用一个函数,该函数从设置为服务器端的HiddenField获取模型的JSON数据。在视图中,我将每个RadioButton的click数据绑定设置为ViewModel之外的JS函数,该函数将隐藏的输入字段的值设置为按钮指定的ID,然后通过单击使服务器回发一个隐藏的按钮客户端。

Inside pageLoad()我使用Sys.WebForms.PageRequestManager.getInstance()。add_endRequest来指定在回发的服务器端完成后应该调用绑定帮助函数。

我的问题:

在设置服务器端之后,带有JSON数据的HiddenField在返回客户端时仍然具有与客户端相同的字符串,即使执行服务器端scriptlet时,我可以看到值正确更新。不确定这里发生了什么。

即使值未更新,也会调用BindingHelper(),但由于某种原因,单击RadioButtons不会再导致事件发生一次回传。

非常感谢对此的任何见解!

代码:

<script type="text/javascript">

     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(BindingHelper)

     function pageLoad() {
        if (!isPostBack()){
            BindingHelper();
        }
    }

    function BindingHelper() {
        var data = <%= hfData.Value%>;
        var model = new DataViewModel();

        model.load(data);
        ko.applyBindings(model);
    }

     function Select(id) {
        document.getElementById('<%=hfSelectedID.ClientID%>').value = id;
        document.getElementById('<%=rbSelect.ClientID%>').click();
    }

    function isPostBack() {
        return document.getElementById('hfPostback').value == 'True';
    }
</script>

HTML:

<table id="tblData">
    <thead>
        <tr>
            <th></th>
            <!-- ko foreach: subViewModel -->
                <th><input type="radio" name="rbGroup" data-bind="value: id, checked: $root.selectedID, click: function() {Select(id);}" /><span data-bind="text: name"></span></th>
            <!-- /ko -->
         </tr>
    </thead>
</table>

<asp:HiddenField ID="hfData" runat="server" />

<asp:HiddenField ID="hfSelectedID" runat="server" />
<input id="hfPostback" type="hidden" value="<%=Page.IsPostBack.ToString()%>" />

<div style="display:none">
    <asp:RadioButton ID="rbSelect" runat ="server" AutoPostBack="true" />
</div>

编辑:我确定如果绑定不在UpdatePanel中,只需将Page BinderHelper()注册为Page_Load中的启动脚本,就可以正常工作。

奇怪的是,即使我通过指定UpdatePanel来注册启动脚本,结果也是一样的。 UpdatePanel中还有其他控件,所以我知道UpdatePanel实际上是更新,并且它没有设置为有条件地更新。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。我最终需要在DOM中找到HiddenField,然后从中解析JSON以获取模型的数据。对我来说似乎很奇怪,即使在服务器端设置了值之后,它仍保留旧值,但UpdatePanel使生命周期复杂化。

此外,我将单击客户端的RadioButton更改为LinkBut​​ton,以使其始终强制回发到服务器。