【问题标题】:Asp.Net Trying to get ClientIDAsp.Net 试图获取 ClientID
【发布时间】:2014-04-28 07:47:54
【问题描述】:

我在试图弄清楚如何将控件 ClientID 传递给我的一个 JavaScript 方法时有点卡住了。

编辑:我意识到我应该提到这是一个基于 .Net 3.5 构建的 Asp.Net 应用程序。不能使用 .Net 4.0 技巧,但是你们在下面的回复中提到的 4.0 技巧绝对是要记住的,并且很容易解决这个问题。

当我执行以下类似操作时,我的 Javascript 方法最终会在我的参数中显示 的文字文本。

下面是我的 Asp.Net 控件在 Aspx 页面中的样子。

<asp:HyperLink ID="aShowList" runat="server" 
onclick="javacript:showCompanySelector('divCompanySelector','<%= gvCompanySelector.ClientID %>');" 
CssClass="button">Select</asp:HyperLink>

我的 javascript 方法如下所示。

function showCompanySelector(divName,gridName) {
            var elem = document.getElementById(divName);
            var gridElem = document.getElementById(gridName);
            if (elem.style.visibility === 'visible') {
                elem.style.visibility = 'hidden';
                elem.style.height = '0px';
                gridElem.style.height = '0px';
            }
            else {
                elem.style.visibility = 'visible';
                elem.style.height = '200px';
                gridElem.style.height = null;
            }
        }

我的 gridName 参数将 的值传递给它。当我期望参数显示类似 ct100_blahlbah_gvCompanySelector ClientID 的内容时。

让我感到沮丧的是,如果我只使用标准的 Anchor 标签,ClientID 就可以正常通过。

如果建议是使用 AddHandler 或在我的代码隐藏中构建 javascript 调用,我想避免它。我试图在这段代码中保持某种一致性。 =-/

谢谢!

【问题讨论】:

    标签: c# javascript asp.net .net clientid


    【解决方案1】:

    为什么需要从参数中传递客户 ID。你也可以这样做。

    function showCompanySelector(divName) {
            var elem = document.getElementById(divName);
            var gridElem = document.getElementById('<%= gvCompanySelector.ClientID %>');
            if (elem.style.visibility === 'visible') {
                elem.style.visibility = 'hidden';
                elem.style.height = '0px';
                gridElem.style.height = '0px';
            }
            else {
                elem.style.visibility = 'visible';
                elem.style.height = '200px';
                gridElem.style.height = null;
            }
        }
    

    另一种做法是针对asp.net 4.0 Static client Id 模式。您可以将 cilent 模式覆盖为静态,然后您可以在自己的控件中传递“gvCompanySelector”。http://www.dotnetjalps.com/2009/07/client-id-of-control-in-aspnet-40.html

    如果您使用的是较低版本的 .NET Framework,您可以像这样覆盖客户端 ID - http://weblog.west-wind.com/posts/2006/Feb/24/Overriding-ClientID-and-UniqueID-on-ASPNET-controls

    首先创建一个名为“MyControls”的类库。将 Referenceecen 添加到 System.web,然后覆盖网格视图,如下所示。

    using System.Web.UI.WebControls;
    namespace MyControls{
    public class MyGrid : GridView
    {
        public override string ClientID
        {
            get
            {
                return ID;
            }
        }
    }}
    

    然后在 aspx 端注册您的控件,如下所示。

    <%@ Register Assembly="MyControls" Namespace="MyControls" TagPrefix="myc" %>
    

    然后使用下面的控件。

     <myc:Mygrid Id="myGrid" runat="server">
    
     </myc:Mygrid>
    

    如果您想查看更多关于覆盖控制的信息,请参阅以下链接-http://www.4guysfromrolla.com/articles/012308-1.aspx

    【讨论】:

    • 因为我在多个地方使用此方法,并且不希望 5 个方法仅仅因为我无法正确传递 clientid 而做完全相同的事情。
    • 如果您使用的是 asp.net 4.0 更高版本,那么您可以将您的客户端 ID 模式设为静态,并在您的参数中直接传递“gvCompanySelector”。因为服务器控件定义中的服务器标签将不起作用。查看更多客户id-dotnetjalps.com/2009/07/client-id-of-control-in-aspnet-40.html
    • 流口水......我想要它。但是不能拥有。我假设......不能使用.Net 4.0。公司还没有把它放在网络服务器上。只是想保持领先(落后的一天)的时代。
    • 您也可以覆盖您的客户端 ID - 如下所示 - weblog.west-wind.com/posts/2006/Feb/24/… 在其他框架中拥有静态客户端 ID
    • 我正在使用 .Net 3.5。并且覆盖选项假设我将其构建为控件与页面功能。理想情况下,我希望将其构建为完全控制,但在现实世界中,项目完成日期!= 执行此任务的时间长度。非常有用的信息。谢谢!
    【解决方案2】:

    我找到的最佳答案是创建一个全局变量。可能比使用 AddHandler 类型编码要少,但至少它使我的 javascript 与我的 javascript 保持一致。

    <script>
    var gvCompanySelectorClientID = = '<%= gvCompanySelector.ClientID %>';
    
    function showCompanySelector(divName,gridName) {
                var elem = document.getElementById(divName);
                var gridElem = document.getElementById(gridName);
                if (elem.style.visibility === 'visible') {
                    elem.style.visibility = 'hidden';
                    elem.style.height = '0px';
                    gridElem.style.height = '0px';
                }
                else {
                    elem.style.visibility = 'visible';
                    elem.style.height = '200px';
                    gridElem.style.height = null;
                }
            }
    
    </script>
    
    <asp:HyperLink ID="aShowList" runat="server" onclick="javacript:showCompanySelector('divCompanySelector','<%= gvCompanySelectorClientID %>');" CssClass="button">Select</asp:HyperLink>
    

    希望有任何其他建议。

    【讨论】:

    • 请注意,在使用 .Net 3.5(或低于 .Net 4.0)时,这是“我的”理想答案。到目前为止。
    【解决方案3】:

    随便用

     var elem = document.getElementById('the id of the required control');
                var gridElem = document.getElementById('the id of the required control');
    

    不用传给javascript,把控件的clientIDmode改成static

    或者

    不需要在参数中传递它

    var gridElem = document.getElementById('<%= idofthecontrol.ClientID %>');
    

    有时它可能会显示错误:

    无法修改 Controls 集合,因为该控件 包含代码块(即 )。

    然后使用

     var gridElem = document.getElementById('<%# idofthecontrol.ClientID %>');
    

    【讨论】:

    • 我在一些地方使用了javascript方法。这个 Javascript 方法专门支持我正在构建的关键功能。特别是类似于多列下拉框的东西。
    • 等等...我刚刚发现...“将 ClientIDmode 更改为静态”。我可以按元素/asp.net 控件执行此操作吗?呃...更具体地说,我可以让我的超链接控件有一个静态 ID 吗?而且我认为将 ClientID 模式更改为静态意味着我给元素的 ID 不会像一些愚蠢的 ct100_blahblah_Im_helping_the_developer_id 类型的 id 一样被搞砸......
    • 挑逗。 ClientIDMode 是一个 .Net 4.0。不过谢谢!我一定会记住的绝招!
    • @RobK.:接受我的回答,如果对你有帮助,请点赞,不客气
    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2012-11-15
    • 2018-09-22
    相关资源
    最近更新 更多