【问题标题】:ASP:Checkbox Autopostback after change when the value has already been changed via JavascriptASP:Checkbox Autopostback after change when the value has been changed when the value has been changed by Javascript
【发布时间】:2012-09-19 23:47:25
【问题描述】:

我有一个 ASP.NET 页面,上面有一个复选框和几个文本框。

当用户取消勾选复选框时,我需要进行一系列检查并告知用户结果。我通过复选框自动回发属性对回发进行这些检查:

<asp:CheckBox ID="chkDecision" runat="server" AutoPostBack="true" />

我实施的另一条业务规则是,当取消选中复选框并且用户开始在其中一个文本框中输入内容时,我必须自动勾选复选框。我正在通过 Javascript 执行此操作:

<asp:TextBox ID="txtLeft" runat="server" CssClass="textboxstandard" MaxLength="50" onkeyDown="SelectDecision(event);">

function SelectDecision(e) {
        if (!checkSpecialKeys(e)) {
            var chkDec = $get('<%=chkDecision.ClientID %>');
            if (!chkDec.checked) {
                chkDec.checked = true;
            }                
        }
    }

以上所有都可以正常工作。

我遇到的这个问题是,当用户开始在框中输入内容时,复选框会打勾。如果他们随后手动取消选中该框,则回发不会触发。

这可能是因为复选框与页面加载时处于相同状态,因此某些内部逻辑认为回发是不必要的。

如何执行上述场景中提到的服务器端检查?

定稿 感谢下面提供的帮助,在测试提供的答案期间,我自己能够进一步推进这一点。我发现我可以在文本框上设置AutoPostBack 属性:

<asp:TextBox ID="txtLeft" runat="server" CssClass="textboxstandard" MaxLength="50" onkeyDown="SelectDecision(event);" AutoPostBack="true"></asp:TextBox>

在我的场景中,虽然实现了与以下相同的目标,但我发现它更有用,因为在完成编辑后会发生回发。感谢您的所有帮助!

【问题讨论】:

  • 谢谢 Pranay - 我周末离开了我的消息来源,但我会在星期一首先尝试你的建议,如果它解决了我的问题,我会接受你的回答。再次感谢!

标签: javascript asp.net checkbox


【解决方案1】:

服务器不会理解客户端的变化。你可以为checkedchange事件编写javascript。

你应该做如下,这个功能检查和取消选中复选框并触发服务器端自动回发

<script type="text/javascript"> 
        function SelectDecision() { 


            var chkDec = $get('<%=chkDecision.ClientID %>');                  

            //For checking or unchecking the checkbox. 
            if (chkDec .checked) { 
                chkDec .checked = false; 
            } 
            else { 
                chkDec .checked = true; 
            } 


            //For firing the click event. 
            if (document.createEventObject) { 
                // dispatch for IE 
                var evt = document.createEventObject(); 
                return element.fireEvent('on' + 'click', evt) 
            } 
            else { 
                // dispatch for firefox + others 
                var evt = document.createEvent("HTMLEvents"); 
                evt.initEvent('click', true, true); // event type,bubbling,cancelable 
                return !element.dispatchEvent(evt); 
            } 
        } 
    </script>

更多信息:http://forums.asp.net/t/1445241.aspx/1/10

【讨论】:

  • 这个事件触发代码比直接的 __doPostBack 调用效果更好。 (至少在 IE 中)。为了帮助未来的搜索者 - 应该在事件代码中使用“chkdec”而不是“元素”。 'element' 将给出 Javascript 未定义错误。这保留了键入的字符,但它确实关闭了文本框上的编辑,因此您需要重置焦点(在处理回发时考虑键入的字符'。
【解决方案2】:

你可以使用:

function SelectDecision(e) {
    if (!checkSpecialKeys(e)) {
        var chkDec = $get('<%=chkDecision.ClientID %>');
        if (!chkDec.checked) {
            chkDec.checked = true;
            __doPostBack('<%=chkDecision.ClientID %>', '');
        }                
    }
}

【讨论】:

  • 我收到了 javascript 错误“SCRIPT5007:属性 '__postback' 的值是 null 或未定义,而不是函数对象”使用此解决方案。 __postback 需要改为 __doPostBack 并且它会触发。与 Pranay 的答案不同,这个答案导致在相关文本框中键入的字符消失了。
  • 当然,我忘记了函数名的拼写。
  • Pranay 的答案包含许多不必要的东西,就像检查浏览类型和引发事件一样糟糕。当事件发生时,无论如何都会调用 doPostBack 函数。为什么你需要不必要的东西?
  • 我只提到函数名称是为了帮助将来出现在这篇文章中的搜索者。正如我在上面的评论中提到的,直接调用回发意味着第一个输入的字符从文本框中丢失了。使用 Pranay 的答案并没有发生这种情况。这是我将他标记为答案的唯一原因。谢谢您的帮助!我非常感谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
相关资源
最近更新 更多