将asp.net ClientId传递给Javascript函数 - 作为参数内联

时间:2011-11-22 17:05:53

标签: javascript asp.net javascript-events

我有一个需要通过javascript函数点击的asp图像按钮。 按下回车键时,文本框的按键也应触发此图像按钮服务器端事件。 男女同校如下: -

标记

    <asp:ImageButton ID="ImageButton3" runat="server" ImageUrl="images/butt_searchoff.png"
    class="sb_search" ToolTip="Search the Database" AlternateText="Search" OnClick="ImageButton3_Click" OnClientClick="SetExpandedCount()"/>

    <input id="tbSearch" runat="server" class="sb_input" type="text" autocomplete="off" onkeypress="return OverridePostBackOnEnter(event, '" & ImageButton3.ClientID & "');" />

我想将ImageButton3 ClientId作为param传递给名为OverridePostBackOnEnter的Javascript函数

Javascript看起来像这样:

     function OverridePostBackOnEnter(event, ctrl) {
        if (event.keyCode == 13) {
            alert(ctrl);
            if ($.browser.mozilla) {
                __doPostBack(ctrl, 'OnClick'); //for IE
            }
            else {
                //but for other browsers you should use
                __doPostBack(ctrl, 'OnClick');
            }
        }
    };

我的发现是什么a)我无法获得正确的ClientId传递,我只是得到未定义或null。

和b)如果我硬编码并将ctrl更改为'cmain_ctl00_ImageButton3',则__dopostback不会调用ImageButton3的服务器端代码。

对此的任何帮助都会非常令人沮丧。

修改

好的,我想我找到了一个解决方案,并认为我应该更新帖子以防任何人需要它。

首先我将ImageButton3上的'ClientIdMode'设置为'Static'

     <asp:ImageButton ID="ImageButton3" ClientIDMode="Static" runat="server" ImageUrl="images/butt_searchoff.png" class="sb_search" ToolTip="Search the Database" AlternateText="Search" OnClick="ImageButton3_Click" OnClientClick="SetExpandedCount()"/>

这允许我将按钮的id传递给函数'OverridePostBackOnEnter'

    <input id="tbSearch" runat="server" class="sb_input" type="text" autocomplete="off" onkeypress="return OverridePostBackOnEnter(event, 'ImageButton3');" />

然后我的javascript变为:

    function OverridePostBackOnEnter(event, ctrl) {
        if (event.keyCode == 13) {
            if ($.browser.mozilla) {
                var overridctrl = document.getElementById(ctrl);
                __doPostBack(overridctrl.name, ''); //for IE
            }
            else {
                //but for other browsers you should use
                var overridctrl = document.getElementById(ctrl);
                __doPostBack(overridectrl.name, '');
            }
        }
    };

通过查看'yourForm._EVENTTARGET.value'和'yourForm。 EVENTARGUMENT.value',我可以看到这些值未被设置。通过使用'document.getelementId'并传递'control.name'来设置这些值并启用' _dopostpack'来调用服务器端事件。

谢谢大家抽出时间来帮助我,非常感激。

4 个答案:

答案 0 :(得分:2)

请改用this关键字。在输入的onkeypress事件的上下文中,this将引用输入对象。因此,this.id就足够了。示例如下:

<input id="tbSearch" runat="server"
                  class="sb_input" type="text"
                  autocomplete="off"  
                  onkeypress="return OverridePostBackOnEnter(event, this.id);" />

修改

完全误读了你的帖子。正确答案如下:

<input id="tbSearch" runat="server"
   class="sb_input" type="text"
   autocomplete="off"  
 onkeypress="return OverridePostBackOnEnter(event, '<%#ImageButton3.ClientID%>');" />

答案 1 :(得分:1)

只需使用this.id

OverridePostBackOnEnter(event, this.id); 

您也可以更改方法并传入元素本身:

OverridePostBackOnEnter(event, this); 

修改

要传入ImageButton的ClientID,请尝试以下方法:

OverridePostBackOnEnter(event, '<%= ImageButton3.ClientID %>'); 

答案 2 :(得分:0)

这很hacky,但这会奏效......

<asp:ImageButton ID="ImageButton3" runat="server" ImageUrl="images/butt_searchoff.png"
    class="sb_search" ToolTip="Search the Database" AlternateText="Search" OnClick="ImageButton3_Click" OnClientClick="SetExpandedCount()"/>

    <input id="tbSearch" runat="server" class="sb_input" type="text" autocomplete="off" onkeypress="return OverridePostBackOnEnter(event, '<asp:Literal ID="otherControlsClientIDHolder" runat="server" />');" />

然后在服务器端将文字的text属性设置为图像按钮的客户端ID ....

otherControlsClientIDHolder.Text = ImageButton3.ClientID;

詹姆斯希尔上面的答案比我的好。它在功能上是一样的,但他更清洁。 +1詹姆斯希尔的回答

答案 3 :(得分:0)

另一种方法是在页面加载时添加属性服务器端。

tbSearch.Attributes.Add("onkeypress", "return OverridePostBackOnEnter(event, '" + ImageButton3.ClientID + "');");