FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 4921|回复: 3
打印 上一主题 下一主题

【已解决】MenuCheckBox的AutoPostback的Bug

[复制链接]
跳转到指定楼层
楼主
发表于 2017-11-17 09:57:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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事件不触发,第二次点击才触发。

沙发
发表于 2017-11-17 18:53:29 | 只看该作者
官网示例没发现问题:http://fineui.com/demo_pro/#/demo_pro/toolbar/menucheckbox.aspx

请基于空项目重现问题,发到客服QQ邮箱:2877408506@qq.com
板凳
 楼主| 发表于 2017-11-20 08:22:08 | 只看该作者


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


不知道你看代码了没,我给的代码跟官网示例不一样好不好,
复现项目已发到客服邮箱,请确认
菜单里的复选框,第一次点击不触发服务端事件
地板
发表于 2017-11-20 09:56:49 | 只看该作者
这个是已知问题,鉴于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 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-4-20 13:05 , Processed in 0.047241 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表