__doPostBack仅在页面上有LinkBut​​ton,Calendar或WizardStep控件时才有效

我发现__doPostBack存在问题并找到了解决方法。 我正在寻找原因的解释和/或比我的工作更好的解决方案。

场景:我有一个填充了值的下拉列表; “ – 选择 – ”,“一个”和“两个”。 如果用户选择“一个”,则执行客户端脚本。 如果用户选择“两个”,则执行服务器端脚本。

问题:客户端脚本通过调用__doPostBack来启动回发。 但是,除非页面上还有LinkBut​​ton,Calendar或WizardStep控件,否则不会实际发生回发。 我实际上浏览了Visual Studio工具箱中的所有标准工具并对它们进行了全部测试。 它必须是这三者之一。

解决方法:添加由跨度包围的链接按钮,并将显示设置为无。

 LinkButton  

问题:有人可以提供这种行为的解释或提供比我的“解决方案”更好的解决方案吗?

来源 – 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', ''); } } }  

来源 – ASPX控制

   -Select- One Two  
LinkButton Time of last Post Back:
Time of OnSelectedIndexChanged:

来源 – 代码背后

  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,返回值和回发的具体限制。 我没有深入研究他们的解决方案,也不确定时间会让我这么做。 主要是发布它,以防我的解决方案失败或无法为其他人工作。

直观地,您可能会认为为DropDownList添加确认对话框与为Button Web控件添加此类对话框相同。 也就是说,只需将DropDownList的客户端onchange属性设置为:return confirm(…);. 使用:DropDownListID.Attributes(“onchange”)=“return confirm(…);” 不幸的是,这不会按预期工作,因为AutoPostBack DropDownList的onchange属性将被设置为一些导致回发的JavaScript,即对客户端__doPostBack函数的调用。 当您自己以编程方式设置onchange属性时,最终结果是呈现的客户端onchange事件处理程序包含您的代码和对__doPostBack的调用:

这篇文章很长,所以搜索“使用AutoPostBack DropDownLists进行确认”

https://msdn.microsoft.com/en-us/library/aa479302.aspx

有2种解决方案。

解决方案1:比添加隐藏span标记包围的链接按钮更好的解决方法是将以下内容添加到页面加载事件中。 这可确保函数__doPostBack可用。

 protected void Page_Load(object sender, EventArgs e) { Page.ClientScript.GetPostBackEventReference(this, string.Empty); } 

仅当表单中的控件需要它才能执行回发时,才会生成函数__doPostBack 。 这包括LinkBut​​ton等控件以及AutoPostBack设置为true其他控件。 实际上,只有Button和ImageButton控件可以在没有__doPostBack情况下执行回发(参见本文 )。 例如,我们可以在HTML输出中看到LinkBut​​ton以这种方式呈现:

 My link 

解决方案2:以下方法在不使用__doPostBack的情况下实现了相同的function。

在本例中,您可以为DropDownList设置AutoPostBack="true"

  

当您想要阻止回发时, 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!