asp.net 后台定义js函数

原创 2012年05月07日 13:16:18

最近遇到这样一个问题:在做统计报表的时候,同一个报表需要再不同的统计方式下显示,所以把该统计报表抽出来做成了一个单独的用户控件,该用户控件中也有自己的查询条件。其中有一个查询条件是从实体库中选择实体后带出来,这是用前台脚本实现的,这样就会存在一个问题,无论在那种统计方式下选择实体,实体的信息只显示在最后一个统计方式下,如下图所示:

最后找出原因是用户控件中选择实体的实现方法是在前台写了一个函数:

 function SelectOwner() {

        var argumentXML = GetArgumentsXML();
        var url = "../../Modules/General/Product/SelectCustomer.aspx";
        var features = "dialogHeight: 650px; dialogWidth: 950px; center: Yes; help: Yes; scroll:auto; status: no; resizable: yes";
        var xmlDom = showModalDialog(url, argumentXML, features);
        if (null != xmlDom) {
            var nodes = xmlDom.selectNodes("root/Customer");
            var id = "";
            var name = "";
            var n = nodes.length - 1;
            var re = /\s/g;
            for (i = 0; i <= n; i++) {
                var node = nodes(i);
                id += node.attributes.getNamedItem("CustomerEntityID").value.replace(re, "") + ((i == n) ? "" : ";");

                name += node.attributes.getNamedItem("CustomerName").value.replace(re, "") + ((i == n) ? "" : ";");
            }

            document.getElementById("<%=tbProprietor.ClientID %>").value = name;
           
        }
        return false;
    }


 

 业主单位
                        <asp:TextBox ID="tbProprietor" runat="server" CssClass="kpms-textboxsearch" EnableTheming="false"></asp:TextBox>
                        <asp:ImageButton ID="ibtnSelectOwner" runat="server" OnClientClick="return SelectOwner();"
                            ImageUrl="~/Themes/Images/btn_select.gif" />


因为这个用户控件在页面中总共使用了三次,所以查看源文件时会发现整个页面有三个SelectOwner()前台函数,系统不知道到底需要哪一个,所以默认为最后一个,所以在前两种统计方式中选择实体后会显示在最后一个统计方式中而不显示在对应的统计方式中。

 

解决方案:

1.在后台定义js函数,在满足条件的情况下给选择按钮增加单击事件的属性。

注意:在后台定义js函数时,若要给某个控件赋值,则需直接取解析出来的html的id值

代码如下:

 private void DefineClick()
        {
            if (SelectType == "工程类型")
            {
                string sCript= @"<script  type='text/javascript'>
        function SelectProject() {
        var argumentXML = GetArgumentsXML();
        url = '../../Modules/General/Product/SelectProject.aspx';
        var features = 'dialogHeight: 650px; dialogWidth: 950px; center: Yes; help: Yes; scroll:auto; status: no; resizable: yes';
        var xmlDom = showModalDialog(url, argumentXML, features);
        if (null != xmlDom) {
            var nodes = xmlDom.selectNodes('root/ProjectEntity');
            var id = '';
            var code = '';
            var name = '';
            var re = /\s/g;
            var n = nodes.length - 1;
            for (i = 0; i <= n; i++) {
                var node = nodes(i);
                id += node.attributes.getNamedItem('ProjectEntityID').value.replace(re, '') + ((i == n) ? '' : ';');
                code += node.attributes.getNamedItem('ProjectEntityCode').value.replace(re, '') + ((i == n) ? '' : ';');
                name += node.attributes.getNamedItem('ProjectEntityName').value.replace(re, '') + ((i == n) ? '' : ';');
            }
            document.getElementById('UCptTypeNotSign_tbProjectPhaseCode').value = code;
            document.getElementById('<%=tbProjectPhaseName.ClientID %>').value = name;
            return true;
        }
        return false;
       }</script>";
                Response.Write(sCript);
                ibtnSelectProject.Attributes.Add("onclick", "return SelectProject()");

            }
            else if (SelectType == "业主")
            {

            }
        }


这样写还是不行,相当于还是有三个相同名称的脚步函数所以调整了下,最终结果如下:

private void DefineClick()
        {
            string script = string.Empty;
            string scriptHeader = "<script  type='text/javascript'>";
            string scriptPTFunName = " function SelectProject() ";
            string scriptPTBody = @"{
        var argumentXML = GetArgumentsXML();
        url = '../../Modules/General/Product/SelectProject.aspx';
        var features = 'dialogHeight: 650px; dialogWidth: 950px; center: Yes; help: Yes; scroll:auto; status: no; resizable: yes';
        var xmlDom = showModalDialog(url, argumentXML, features);
        if (null != xmlDom) {
            var nodes = xmlDom.selectNodes('root/ProjectEntity');
            var id = '';
            var code = '';
            var name = '';
            var re = /\s/g;
            var n = nodes.length - 1;
            for (i = 0; i <= n; i++) {
                var node = nodes(i);
                id += node.attributes.getNamedItem('ProjectEntityID').value.replace(re, '') + ((i == n) ? '' : ';');
                code += node.attributes.getNamedItem('ProjectEntityCode').value.replace(re, '') + ((i == n) ? '' : ';');
                name += node.attributes.getNamedItem('ProjectEntityName').value.replace(re, '') + ((i == n) ? '' : ';');
            }";
            string scriptPTFooter = string.Empty;

            string scriptOwnerFunName = " function SelectOwner() ";
            string scriptOwnerBody = @"  {
        var argumentXML = GetArgumentsXML();
        var url = '../../Modules/General/Product/SelectCustomer.aspx';
        var features = 'dialogHeight: 650px; dialogWidth: 950px; center: Yes; help: Yes; scroll:auto; status: no; resizable: yes';
        var xmlDom = showModalDialog(url, argumentXML, features);
        if (null != xmlDom) {
            var nodes = xmlDom.selectNodes('root/Customer');
            var id = '';
            var name = '';
            var n = nodes.length - 1;
            var re = /\s/g;
            for (i = 0; i <= n; i++) {
                var node = nodes(i);
                id += node.attributes.getNamedItem('CustomerEntityID').value.replace(re, '') + ((i == n) ? '' : ';');

                name += node.attributes.getNamedItem('CustomerName').value.replace(re, '') + ((i == n) ? '' : ';');
            }";
            string scriptOwnerFooter = string.Empty;

            string scriptFooter = "</script>";
            if (SelectType == "工程类型")
            {
                scriptPTFunName = "function PTSelectProject()";
                scriptOwnerFunName = "function PTSelectOwner()";
                scriptPTFooter = @"
            document.getElementById('UCptTypeNotSign_tbProjectPhaseCode').value = code;
            document.getElementById('UCptTypeNotSign_tbProjectPhaseName').value = name;
            return true;
        }
        return false;
       }";
                scriptOwnerFooter = @"
             document.getElementById('UCptTypeNotSign_tbProprietor').value = name;
           
        }
        return false;
    }";
                script = scriptHeader + scriptPTFunName + scriptPTBody + scriptPTFooter + scriptOwnerFunName + scriptOwnerBody + scriptOwnerFooter + scriptFooter;
                Response.Write(script);
                ibtnSelectProject.Attributes.Add("onclick", "return PTSelectProject()");
                ibtnSelectOwner.Attributes.Add("onclick", "return PTSelectOwner()");
            }

            else if (SelectType == "业主")
            {
                scriptPTFunName = "function OWSelectProject()";
                scriptOwnerFunName = "function OWSelectOwner()";
                scriptPTFooter = @"
            document.getElementById('UCOwnerNotSign_tbProjectPhaseCode').value = code;
            document.getElementById('UCOwnerNotSign_tbProjectPhaseName').value = name;
            return true;
        }
        return false;
       }";
                scriptOwnerFooter = @"
             document.getElementById('UCOwnerNotSign_tbProprietor').value = name;
           
        }
        return false;
    }";
                script = scriptHeader + scriptPTFunName + scriptPTBody + scriptPTFooter + scriptOwnerFunName + scriptOwnerBody + scriptOwnerFooter + scriptFooter;

                Response.Write(script);
                ibtnSelectProject.Attributes.Add("onclick", "return OWSelectProject()");
                ibtnSelectOwner.Attributes.Add("onclick", "return OWSelectOwner()");

            }

            else if (SelectType == "合同类型")
            {
                scriptPTFunName = "function CTSelectProject()";
                scriptOwnerFunName = "function CTSelectOwner()";
                scriptPTFooter += @"
            document.getElementById('UCctTypeNotSign_tbProjectPhaseCode').value = code;
            document.getElementById('UCctTypeNotSign_tbProjectPhaseName').value = name;
            return true;
        }
        return false;
       }";
                scriptOwnerFooter += @"
             document.getElementById('UCctTypeNotSign_tbProprietor').value = name;
        }
        return false;
    }";
                script = scriptHeader + scriptPTFunName + scriptPTBody + scriptPTFooter + scriptOwnerFunName + scriptOwnerBody + scriptOwnerFooter + scriptFooter;

                Response.Write(script);
                ibtnSelectProject.Attributes.Add("onclick", "return CTSelectProject()");
                ibtnSelectOwner.Attributes.Add("onclick", "return CTSelectOwner()");

            }
        }


显示成功,只是这个函数太长了,应该还可以进一步优化。


 

ASP.NET中JavaScript 调用后台代码

前序:在不需要右击页面或回发的情况下刷新页面,即JS调用后台代码; 方法一:调用隐藏服务端按钮的点击事件        1、在前端放一个隐藏按钮,将需要调用的后台代码写入OnClick事件中;  ...
  • rosefly110
  • rosefly110
  • 2015年02月12日 18:06
  • 1421

asp.net与JS传值、访问值

如何在C#中访问JavaScript函数? c#代码中执行javaScript函数: 方法一:ClientScript.RegisterStartupScript(this.GetType(), ...
  • sunroyi666
  • sunroyi666
  • 2016年07月08日 16:53
  • 2175

Asp.Net 如何调用js中的函数function ?

http://bbs.csdn.net/topics/330215458 1、直接在前台调用 javascript 函数  很简单,在 head 元素之间加入 script 元素,将 ty...
  • DJ2008
  • DJ2008
  • 2013年09月28日 17:34
  • 5424

ASP.NET前台JS与后台CS函数如何互相调用

在实际的Web开发中,我们可能会常常遇到后台调用前台JS代码或者前台JS调用后台代码的情况。今天就把比较实用的前后台相互调用的方法总结出来和大家分享。 后台代码调用前台JS代码 一、说到后台代码调...
  • skyandcode
  • skyandcode
  • 2013年07月06日 18:12
  • 22538

ASP.NET前台JS与后台CS函数如何互相调用

在实际的Web开发中,我们可能会常常遇到后台调用前台JS代码或者前台JS调用后台代码的情况。今天就把比较实用的前后台相互调用的方法总结出来和大家分享。 后台代码调用前台JS代码 一、说到后台代码调...
  • ht_gaogao
  • ht_gaogao
  • 2013年10月25日 00:11
  • 339

ASP.NET前台JS与后台CS函数如何互相调用

在实际的Web开发中,我们可能会常常遇到后台调用前台JS代码或者前台JS调用后台代码的情况。今天就把比较实用的前后台相互调用的方法总结出来和大家分享。 后台代码调用前台JS代码 一、说到后...
  • u014023256
  • u014023256
  • 2014年04月01日 15:09
  • 267

...后台代码中如何调用 javascript 函数的问题! - ASP.NET专题(按钮事件中调用JS文件中函数)

通常javascript代码可以与HTML标签一起直接放在前端页面中,但如果JS代码多的话一方面不利于维护,另一方面也对搜索引擎不友好,因 为页面因此而变得臃肿;所以一般有良好开发习惯的程序员都会把j...
  • xinworld123
  • xinworld123
  • 2012年12月16日 20:55
  • 1107

Asp.net 后台调用js方法

1. 用Response.Write方法  代码如下: Response.Write("alert("XXX");");  此方只能调用内部函数,具体调用自定义的函数只能在Response.Write...
  • GrandShaw
  • GrandShaw
  • 2016年11月21日 13:49
  • 3233

asp.net中后台c#数组与前台js数组交互

在上一篇《asp.net中javascript与后台c#交互》中实现了前端脚本javascript调用后台的数据库的数据。但新的问题又出现了,由于地图上有多个点,所以存放google maps的lon...
  • a6225301
  • a6225301
  • 2014年02月26日 21:47
  • 10647

一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(1)

应用程序的基本框架已经搭建好了,现在要做的是完成一个个的功能模块。先从简单做起,完成用户管理模块,该模块主要功能是使用一个Grid显示用户信息,并使用RowEditing进行用户的编辑、添加操作。Gr...
  • tianxiaode
  • tianxiaode
  • 2012年09月25日 16:39
  • 5995
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp.net 后台定义js函数
举报原因:
原因补充:

(最多只允许输入30个字)