FineUI 官方论坛

标题: 【已解决】MenuCheckBox的AutoPostback的Bug [打印本页]

作者: hcp    时间: 2017-11-17 09:57
标题: 【已解决】MenuCheckBox的AutoPostback的Bug
FineUIPro 版本:4.0.0.2,  页面代码如下:
aspx:
  1.     <form id="form1" runat="server">
  2.         <f:PageManager ID="PageManager1" runat="server" />
  3.         <f:Button ID="btnMenu" Text="中国科学技术大学" EnablePostBack="false" IconFont="Motorcycle" runat="server">
  4.             <Menu runat="server">
  5.                 <f:MenuCheckBox runat="server" ID="chkTest" Text="测试复选框" AutoPostBack="true" OnCheckedChanged="chkTest_CheckedChanged"></f:MenuCheckBox>
  6.             </Menu>
  7.         </f:Button>
  8.     </form>
  9.     <script>
  10.         F.ready(function () {
  11.             F('<%=chkTest.ClientID%>').setChecked(true);
  12.         });
  13.     </script>
复制代码
cs:
  1. protected void chkTest_CheckedChanged(object sender, CheckedEventArgs e)
  2.         {
  3.          ShowNotify(e.Checked.ToString());
  4.         }
复制代码


异常现象:加载页面后,第一次点击复选框,服务端的CheckedChanged事件不触发,第二次点击才触发。


作者: sanshi    时间: 2017-11-17 18:53
官网示例没发现问题:http://fineui.com/demo_pro/#/demo_pro/toolbar/menucheckbox.aspx

请基于空项目重现问题,发到客服QQ邮箱:2877408506@qq.com
作者: hcp    时间: 2017-11-20 08:22
sanshi 发表于 2017-11-17 18:53
官网示例没发现问题:http://fineui.com/demo_pro/#/demo_pro/toolbar/menucheckbox.aspx

请基于空项目重 ...


本帖最后由 hcp 于 2017-11-20 08:21 编辑


不知道你看代码了没,我给的代码跟官网示例不一样好不好,
复现项目已发到客服邮箱,请确认
菜单里的复选框,第一次点击不触发服务端事件
作者: sanshi    时间: 2017-11-20 09:56
这个是已知问题,鉴于WebForms的工作原理,这个无法修正。原因如下:==================================

1. 你在客户端修改了MenuCheckBox的状态为true:
  1. F.ready(function () {
  2.             F('<%=chkTest.ClientID%>').setChecked(true);
  3.         });
复制代码
2. 第一次点击时,客户端修改MenuCheckBox的状态为false。虽然客户端进行了两次状态改变 false(page load stage)->true->false,但是服务器记录的状态却一直是false,服务器端无从得知客户端的两次变化,所以不会触发服务器端事件OnCheckedChanged。



我可以给出两个解决办法,来绕过这个问题。
解决办法一:服务器端设置MenuCheckBox的状态:
===================
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.         if (!IsPostBack)
  4.         {
  5.                 chkTest.Checked = true;
  6.         }
  7. }

  8. protected void chkTest_CheckedChanged(object sender, CheckedEventArgs e)
  9. {
  10.         PageContext.RegisterStartupScript("alert('check changed');");
  11. }
复制代码
  1. <form id="form1" runat="server">
  2.         <f:PageManager ID="PageManager1" runat="server" />
  3.         <f:Button ID="btnMenu" Text="中国科学技术大学" EnablePostBack="false" IconFont="Motorcycle" runat="server">
  4.                 <Menu runat="server">
  5.                         <f:MenuCheckBox runat="server" ID="chkTest" Text="测试复选框" AutoPostBack="true" OnCheckedChanged="chkTest_CheckedChanged"></f:MenuCheckBox>
  6.                 </Menu>
  7.         </f:Button>
  8. </form>
  9. <script>
  10.         F.ready(function () {
  11.                 // ...
  12.         });
  13. </script>
复制代码


解决办法二:客户端事件,自定义回发:
==============
  1. <form id="form1" runat="server">
  2.         <f:PageManager ID="PageManager1" runat="server" />
  3.         <f:Button ID="btnMenu" Text="中国科学技术大学" EnablePostBack="false" IconFont="Motorcycle" runat="server">
  4.                 <Menu runat="server">
  5.                         <f:MenuCheckBox runat="server" ID="chkTest" Text="测试复选框" >
  6.                                 <Listeners>
  7.                                         <f:Listener Event="checkchange" Handler="onMenuCheckChange" />
  8.                                 </Listeners>
  9.                         </f:MenuCheckBox>
  10.                 </Menu>
  11.         </f:Button>
  12.         
  13. </form>
  14. <script>
  15.         F.ready(function () {
  16.                 F('<%=chkTest.ClientID%>').setChecked(true);
  17.         });

  18.         function onMenuCheckChange() {
  19.                 __doPostBack('', 'chkTest_CheckChange');
  20.         }
  21. </script>
复制代码
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.         if (!IsPostBack)
  4.         {

  5.         }
  6.         else
  7.         {
  8.                 if (Request.Form["__EVENTARGUMENT"] == "chkTest_CheckChange")
  9.                 {
  10.                         PageContext.RegisterStartupScript("alert('checked changed: " + chkTest.Checked + "');");
  11.                 }
  12.         }
  13. }
复制代码








欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4