简单的ASP.NET应用程序。
我有两个下拉控件。在第一次下拉时,我有一个JavaScript onChange
事件。 JavaScript启用第二个下拉列表并从中删除一个值(在第一个下拉列表中选择的值)。如果他们单击下拉列表的空白第一个值,则将禁用第二个下拉列表(并重置选项)。
我还在OnPreRender
方法中有代码,该代码将根据第一个下拉列表的值启用或禁用第二个下拉列表。这样可以在代码中选择第一个下拉列表的值(加载用户设置)。
我的问题是:
我已尝试通过ClientScript.RegisterStartupScript
添加启动脚本(将设置第二次下拉列表的正确状态),但是当调用此脚本时,第一个下拉列表的selectedIndex
为0
,而不是它实际上是什么。我的猜测是选择的值在我的启动脚本之后设置(但仍然没有调用onChange
脚本)。
关于尝试什么的任何想法?
答案 0 :(得分:4)
如果第二个下拉列表最初是通过javascript启用的(我假设这是在javascript onchange期间,因为你没有指定),然后单击后退按钮重新加载以前的回发将永远不会启用它。
将ASP.NET与经典javascript混合可能会很毛茸茸。您可能希望查看ASP.NET的Ajax实现(如果您被迫使用较旧的ASP.NET版本,则可以查看第三方AjaxPanel控件)。这些将通过纯C#为您提供您想要的行为,而不会强迫您使用javascript hackery-pokery。
答案 1 :(得分:2)
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void indexChanged(object sender, EventArgs e)
{
Label1.Text = " I did something! ";
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Test Page</title>
</head>
<body>
<script type="text/javascript">
function firstChanged() {
if(document.getElementById("firstSelect").selectedIndex != 0)
document.getElementById("secondSelect").disabled = false;
else
document.getElementById("secondSelect").disabled = true;
}
</script>
<form id="form1" runat="server">
<div>
<select id="firstSelect" onchange="firstChanged()">
<option value="0"></option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
<select id="secondSelect" disabled="disabled">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
<asp:DropDownList ID="DropDownList1" AutoPostBack="true" OnSelectedIndexChanged="indexChanged" runat="server">
<asp:ListItem Text="One" Value="1"></asp:ListItem>
<asp:ListItem Text="Two" Value="2"></asp:ListItem>
</asp:DropDownList>
<asp:Label ID="Label1" runat="server"></asp:Label>
</div>
</form>
<script type="text/javascript">
window.onload = function() {firstChanged();}
</script>
</body>
</html>
编辑:替换整个代码。这甚至可以在您的用户控件中使用。 我相信Register.ClientScriptBlock不起作用,因为您在 window.onload被调用之前在中执行了该块中编写的代码。并且,我假设(我不确定这一点)DOM对象当时没有设置它们的值。而且,这就是为什么你总是将selectedIndex变为0。