我的网页中有以下文本框服务器控件:
<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, <%= txtZip.ClientId %>, txtCity, txtState);" />
我正在尝试将文本框的客户端ID作为第二个参数传递给此Javascript函数:
function ZipCode_OnChange(txtZipCode, ClientId) {
var ret;
ret = WebService.GetCityAndState(txtZipCode.value, OnComplete1, OnError, ClientId);
}
如何在服务器上获取它,评估texbox的控件并将该文字字符串传递给Javascript函数?
答案 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呈现'<%= TargetControl.ClientID %>'
并且未调用相关的javascript函数。
当使用'<%= TargetControl.ClientID %>'
(周围带有单引号)时,ASP.NET不会评估表达式并在单引号内呈现完全相同的内容。
所以我决定尝试使用输入(Checkbox)HTLM控件,使用以下标记
<input id="CheckBox1" type="checkbox" onclick="myFunction(someValue, '<%= TargetControl.ClientID %>')" />
它工作了!!!
希望它有所帮助。