我发现__doPostBack存在问题并找到了解决方法。我正在寻找原因的解释和/或比我的工作更好的解决方案。
情境: 我有一个填充了值的下拉列表; “-Select-”,“One”& “二”。如果用户选择“一个”,则执行客户端脚本。如果用户选择“两个”,则执行服务器端脚本。
问题: 客户端脚本通过调用__doPostBack来启动回发。但是,除非页面上还有LinkButton,Calendar或WizardStep控件,否则不会实际发生回发。我实际上浏览了Visual Studio Toolbox中的所有标准工具并对它们进行了全部测试。它必须是这三者之一。
解决方法: 添加由跨度包围的链接按钮,其显示设置为无。
<span style="display:none;">
<asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
</span>
问题:有人可以提供此行为的解释或提供比我的“解决方案”更好的解决方案吗?
来源 - Javascript (我把它放在头标记之间)
<script language="javascript" type="text/javascript">
function DropDownList1_change(elementRef) {
var selectedIndex = elementRef.selectedIndex;
if (selectedIndex > 0) {
var selectedValue = elementRef.options[selectedIndex].value;
if (selectedValue == "One") {
alert("Because you selected 'One', special javascript code will be executed");
// Special javascript code goes here
return;
}
else if (selectedValue == "Two") {
// Special server code gets executed on server DropDownList1_SelectedIndexChanged
__doPostBack('DropDownList1', '');
}
}
}
</script>
来源 - ASPX控件
<asp:DropDownList ID="DropDownList1" runat="server" onchange="DropDownList1_change(this)" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem>-Select-</asp:ListItem>
<asp:ListItem>One</asp:ListItem>
<asp:ListItem>Two</asp:ListItem>
</asp:DropDownList>
<br />
<!-- For some unknown reason __doPostBack only works if there is a LinkButton, Calendar or WizardStep control on the page -->
<span style="display:none;">
<asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
</span>
Time of last Post Back: <asp:Label ID="Label1" runat="server"></asp:Label><br />
Time of OnSelectedIndexChanged: <asp:Label ID="Label2" runat="server"></asp:Label>
来源 - 代码背后
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToLongTimeString();
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
Label2.Text = DateTime.Now.ToLongTimeString();
}
其他资源 - 发布此问题后我发现了以下文章。它是一篇非常古老的微软文章,也是我发现的唯一微软文章,提到了DropDowns的特定限制,返回值和&amp;回发。我没有深入研究他们的解决方案,也不确定时间会让我这么做。主要是发布它,以防我的解决方案失败或无法为其他人工作。
直观地说,你可能会认为为a添加一个确认对话框 DropDownList与为Button Web添加这样的对话框相同 控制。也就是说,只需设置DropDownList的客户端onchange即可 属性为:return confirm(...);.使用: DropDownListID.Attributes(“onchange”)=“return confirm(...);” 不幸的是,由于AutoPostBack,这将无法正常工作 DropDownList的onchange属性将设置为一些JavaScript 导致回发,即调用客户端__doPostBack 功能。以编程方式设置onchange属性时 你自己,最终的结果是渲染的客户端onchange 事件处理程序包含您的代码和对__doPostBack的调用:
文章很长,所以搜索“使用AutoPostBack DropDownLists进行确认”
答案 0 :(得分:4)
有两种解决方案。
解决方案1: 比添加隐藏span标记包围的链接按钮更好work around是将以下内容添加到页面加载事件中。这确保函数__doPostBack可用。
protected void Page_Load(object sender, EventArgs e)
{
Page.ClientScript.GetPostBackEventReference(this, string.Empty);
}
仅当表单中的控件需要执行回发时才会生成函数__doPostBack
。这包括LinkButton等控件以及AutoPostBack
设置为true
的其他控件。实际上,只有Button和ImageButton控件可以在没有__doPostBack
的情况下执行回发(请参阅this article)。例如,我们可以在HTML输出中看到LinkButton以这种方式呈现:
<a id="lnk" href="javascript:__doPostBack('lnk','')">My link</a>
<小时/> 解决方案2:以下方法在不使用__doPostBack的情况下实现了相同的目标。
在本例中,您可以为DropDownList设置AutoPostBack="true"
:
<asp:DropDownList AutoPostBack="true" onchange="if (!confirmPostBack(this)) return false;" ... >
当您想要阻止回发时,onchange
事件处理程序将返回false
。 Javascript函数可能是这样的:
function confirmPostBack(ddl)
{
if (condition) {
...
return true;
}
else {
...
return false;
}
}
重要:onchange
事件处理程序不应返回任何内容以允许回发发生。您可以使用以下语法:
onchange="if (!confirmPostBack(this)) return false;"
由于问题中提到的文章中可能解释的原因,以下语法不起作用。返回true
仍会阻止回发。
onchange="return confirmPostBack(this);" // Does not work!