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

时间:2009-09-01 12:54:54

标签: asp.net javascript

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

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

当页面呈现时,它构建包括以下内容:

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

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

function ZipCode_OnChange(txtZipCode, ClientId) {
    var ret;
    ret = WebService.GetCityAndState(txtZipCode.value, OnComplete1, OnError, ClientId);
}

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

6 个答案:

答案 0 :(得分:14)

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

'<%= txtZip.ClientId %>'


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

<强>更新

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

我也喜欢this answer

答案 1 :(得分: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); 
}

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

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

答案 2 :(得分: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);
}

答案 3 :(得分:1)

遇到同样的问题,无法通过上面给出的任何方法修复。所以我添加了一个中间JS,基于传递的值添加了对实际JS函数的调用。我知道解决它的一种蹩脚方法,但它仍然适用于我。

在:

<asp:ListBox ID="List1" runat="server" ondblclick="AddToList2( this,'<%= List2.ClientID %>' );" SelectionMode="Multiple" />

<asp:ListBox ID="List1" runat="server" ondblclick="ProcessList('Add');" SelectionMode="Multiple" />

<script>
function ProcessList(xStr){
 if(xStr == "Add")
  AddToList2( '<%= List1.ClientID %>', '<%= List2.ClientID %>' );
 else
  DeleteFromList2( '<%= List2.ClientID %>' );}
</script>

答案 4 :(得分:1)

您可以在page_load方法中添加后面代码中的onchange事件。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;
    txtZip.Attributes.Add("onclick", "ZipCode_OnChange(" + txtZip.ClientID + ")");
}

如果你想传递多个控件及其ClientID,那么这种方法是不错的选择。

我希望这能解决问题。

答案 5 :(得分:0)

我用<asp:CheckBox...

解决了同样的问题

当使用<%= TargetControl.ClientID %>(没有单引号)时,ASP.NET呈现'&lt;%= TargetControl.ClientID %>'并且未调用相关的javascript函数。

当使用'<%= TargetControl.ClientID %>'(周围带有单引号)时,ASP.NET不会评估表达式并在单引号内呈现完全相同的内容。

所以我决定尝试使用输入(Checkbox)HTLM控件,使用以下标记

<input id="CheckBox1" type="checkbox" onclick="myFunction(someValue, '<%= TargetControl.ClientID %>')" />

它工作了!!!

希望它有所帮助。