我有一个带有表的页面,在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实际上是更新,并且它没有设置为有条件地更新。
答案 0 :(得分:0)
我解决了这个问题。我最终需要在DOM中找到HiddenField,然后从中解析JSON以获取模型的数据。对我来说似乎很奇怪,即使在服务器端设置了值之后,它仍保留旧值,但UpdatePanel使生命周期复杂化。
此外,我将单击客户端的RadioButton更改为LinkButton,以使其始终强制回发到服务器。