如何将服务器控件的实际客户端ID传递给javascript函数?

Cha*_*adD 7 javascript asp.net

我的网页中有以下文本框服务器控件:

<asp:TextBox ID="txtZip" runat="server" onchange="ZipCode_OnChange(this, <%= txtZip.ClientId %>, txtCity, txtState);/">
Run Code Online (Sandbox Code Playgroud)

页面呈现时,它包含以下内容:

<input name="txtZip" type="text" id="txtZip" onchange="ZipCode_OnChange(this, &lt;%= txtZip.ClientId %>, txtCity, txtState);" />
Run Code Online (Sandbox Code Playgroud)

我正在尝试将文本框的客户端ID作为第二个参数传递给此Javascript函数:

function ZipCode_OnChange(txtZipCode, ClientId) {
    var ret;
    ret = WebService.GetCityAndState(txtZipCode.value, OnComplete1, OnError, ClientId);
}
Run Code Online (Sandbox Code Playgroud)

如何在服务器上获取它,评估texbox的控件并将该文字字符串传递给Javascript函数?

Amr*_*rhy 14

放在<%= txtZip.ClientId %>单引号之间,如下所示:

'<%= txtZip.ClientId %>'


<asp:TextBox ID="txtZip" runat="server" onchange="ZipCode_OnChange(this, '<%= txtZip.ClientId %>', txtCity, txtState);" />
Run Code Online (Sandbox Code Playgroud)

更新

请查看这篇文章:http://www.jagregory.com/writings/how-to-use-clientids-in-javascript-without-the-ugliness/

我也喜欢这个答案

  • 我之前尝试过,但最终传递给函数的是文字"'<%= txtZip.ClientId%>'",服务器端%thingy中的文本从未被评估过. (11认同)

Joe*_*orn 7

有很多方法可以解决这个问题,但我发现在一般情况下最简单的方法是使用ScriptManager在我的页面顶部包含一个单独的脚本,专门用于添加ClientID:

void AddClientIDs()
{
    var clientIDs = new StringBuilder();
    var declaration = "var {0}={1};";

    clientIDs.AppendFormat(declaration, "txtZip", txtZip.ClientID);        


    ClientScript.RegisterClientScriptBlock(this.GetType(), "ClientIDs", clientIDs.ToString(), true); 
}
Run Code Online (Sandbox Code Playgroud)

在PreRender事件中调用它(在数据绑定之后的某个地方).然后,如果你想得到一点幻想,你可以轻松地调整方法以接受IEnumerable或params控件数组,并让它使用javascript变量名称的控件名称.有时我这样做,但通常很简单,只需将我需要的东西直接添加到方法中.

即使这有点尴尬,因为包括在其他命名容器(如网格)中的控件仍然可能导致问题.我想看看ASP.Net团队很快将这样的东西直接构建到框架中,但我并不是真的期待它:(


and*_*lzo 6

<asp:TextBox ID="txtZip" runat="server" onchange="ZipCode_OnChange(this, txtCity, txtState);">


function ZipCode_OnChange(element, txtCity, txtState) {
    var ClientId = element.getAttribute('id'),
        ret = null,
        value = element.value;

    ret = WebService.GetCityAndState(value, OnComplete1, OnError, ClientId);
}
Run Code Online (Sandbox Code Playgroud)