FineUI 官方论坛

标题: 【已解决】用户控件中如何正确使用JavaScript代码 [打印本页]

作者: 牙膏人    时间: 2014-7-4 16:20
标题: 【已解决】用户控件中如何正确使用JavaScript代码
背景:使用了两个一样的自定义控件(自定义控件类:WebUserControl1),且自定义控件内部设置了回车自动跳到下一个控件的功能;
           用按钮通过javascript对自定义控件内部的隐藏表单进行赋值。

总共两个问题:
1、页面上的第二个自定义控件当在4的位置敲回车就到第一个自定义控件里面去了。
2、点击”给值“之后能看到隐藏表单域里面的值,但在页面上点”取值“按钮获取不到。

作者: 牙膏人    时间: 2014-7-4 16:47
随后的截图
作者: 牙膏人    时间: 2014-7-4 16:48
  1. <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="EmptyProjectNet20_FineUI.WebUserControl1" %>

  2. <f:Form ID="Form3" runat="server" BodyPadding="10px" ShowHeader="false" LabelWidth="120px" ShowBorder="false">
  3.     <Rows>
  4.         <f:FormRow ID="FormRow1" runat="server" ColumnWidths="26% 26% 26%">
  5.             <Items>
  6.                 <f:NumberBox ID="nm1" runat="server" Label="项1" Required="true" NextFocusControl="nm2">
  7.                 </f:NumberBox>
  8.                 <f:NumberBox ID="nm2" runat="server" Label="项2" MaxValue="100" MinValue="0" Required="true" DecimalPrecision="4" NextFocusControl="nm3">
  9.                 </f:NumberBox>
  10.                 <f:NumberBox ID="nm3" runat="server" Label="项3" MaxValue="100" MinValue="0" Required="true" DecimalPrecision="4">
  11.                 </f:NumberBox>
  12.                 <f:HiddenField runat="server" ID="hf001"></f:HiddenField>
  13.                 <f:Button runat="server" EnablePostBack="false" Text="给值" OnClientClick="SetV();"></f:Button>
  14.             </Items>
  15.         </f:FormRow>
  16.     </Rows>
  17. </f:Form>
  18. <script type="text/javascript" >
  19.     function SetV() {
  20.         var id = '<%=hf001.ClientID %>';
  21.         document.getElementById(id).value = "123";
  22.         alert(document.getElementById(id).value);
  23.     }
  24. </script>
复制代码

作者: 牙膏人    时间: 2014-7-4 16:48
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Web;
  4. using System.Web.UI;
  5. using System.Web.UI.WebControls;

  6. namespace EmptyProjectNet20_FineUI
  7. {
  8.     public partial class WebUserControl1 : System.Web.UI.UserControl
  9.     {
  10.         protected void Page_Load(object sender, EventArgs e)
  11.         {

  12.         }

  13.         public string GetValue()
  14.         {
  15.             return this.hf001.Text;
  16.         }
  17.     }
  18. }
复制代码

作者: 牙膏人    时间: 2014-7-4 16:49
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="EmptyProjectNet20_FineUI.Test" %>

  2. <%@ Register Src="~/WebUserControl1.ascx" TagPrefix="uc1" TagName="WebUserControl1" %>
  3. <!DOCTYPE html>

  4. <html xmlns="http://www.w3.org/1999/xhtml">
  5. <head runat="server">
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  7.     <title></title>
  8. </head>
  9. <body>
  10.     <f:PageManager runat="server" />
  11.     <form id="form1" runat="server">
  12.     <f:Panel runat="server">
  13.         <Items>
  14.             <f:UserControlConnector runat="server">
  15.                 <uc1:WebUserControl1 runat="server" id="WebUserControl1" />
  16.                 <uc1:WebUserControl1 runat="server" id="WebUserControl2" />
  17.             </f:UserControlConnector>
  18.             <f:Button runat="server" ID="btnA" Text="取我" OnClick="btnA_Click"></f:Button>
  19.         </Items>
  20.     </f:Panel>
  21.     </form>
  22. </body>
  23. </html>
复制代码

作者: 牙膏人    时间: 2014-7-4 16:49
  1. using System;
  2. using System.Collections.Generic;

  3. using System.Web;
  4. using System.Web.UI;
  5. using System.Web.UI.WebControls;

  6. namespace EmptyProjectNet20_FineUI
  7. {
  8.     public partial class Test : System.Web.UI.Page
  9.     {
  10.         protected void Page_Load(object sender, EventArgs e)
  11.         {

  12.         }

  13.         protected void btnA_Click(object sender, EventArgs e)
  14.         {
  15.             string strA = this.WebUserControl1.GetValue();
  16.             FineUI.Alert.Show(strA);
  17.         }
  18.     }
  19. }
复制代码

作者: sanshi    时间: 2014-7-4 17:05
给个ZIP包,也好调试
作者: 牙膏人    时间: 2014-7-4 17:15
sanshi 发表于 2014-7-4 17:05
给个ZIP包,也好调试

在群里面有,这边太大放不上来
作者: sanshi    时间: 2014-7-5 10:30
第一个问题是FineUI的BUG。

第二个问题是自身代码问题:由于页面包含两个相同的用户控件,所以生成的HTML代码也是两份,如下所示:
  1.     <div id="ctl04_wrapper">
  2.                
  3. <script type="text/javascript" >
  4.     function SetV() {
  5.         var id = 'ctl04_ctl00_WebUserControl1_Form3_FormRow1_hf001';
  6.         document.getElementById(id).value = "123";
  7.         alert(document.getElementById(id).value);
  8.     }
  9. </script>

  10.                
  11. <script type="text/javascript" >
  12.     function SetV() {
  13.         var id = 'ctl04_ctl00_WebUserControl2_Form3_FormRow1_hf001';
  14.         document.getElementById(id).value = "123";
  15.         alert(document.getElementById(id).value);
  16.     }
  17. </script>

  18.             </div>
复制代码

很明显,可以看出,第二个 SetV 的定义覆盖了第一个 SetV 的定义,所以页面上对 SetV 的调用只会对第二个控件中的隐藏字段赋值,当然在后台无法取到第一个用户控件中的隐藏字段值。

正确的做法是:
1. 把 SetV 移动到 页面中(test.aspx):
  1. <script type="text/javascript">
  2.         function setV(id) {
  3.             document.getElementById(id).value = "123";
  4.             alert(document.getElementById(id).value);
  5.         }
  6.     </script>
复制代码

2. 把用户控件中的 SetV 删除,然后在后台代码中:
  1. protected void Page_Load(object sender, EventArgs e)
  2.         {
  3.             if (!IsPostBack)
  4.             {
  5.                 btnGeizhi.OnClientClick = String.Format("setV('{0}-inputEl');", hf001.ClientID);
  6.             }
  7.         }
复制代码

还要注意一点:这里只所以在 hf001.ClientID 后面又加个 -inputEl ,是由 HiddenField 生成 HTML 决定的(可以用浏览器调试工具看下生成的HTML结构)。








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