在后的DropDownList不回发,即使设定的AutoPostBack
使用asp.net页面用C#代码隐藏的结束暗纹的解决方案,我已经成功地构建和填充一个DropDownList。
我想要做的是捕获从下拉列表中选择的新值(最好使用回发到我的代码隐藏)。然后代码隐藏可以根据这个新选择的下拉列表值更新页面上的其他内容。
我第一次尝试是使用
<asp:DropDownList ID="myDDL" runat="server" AutoPostBack="true" OnSelectedIndexChanged="foo"></asp:DropDownList>
与C#方法
public void foo(object sender, EventArgs e)
{
DropDownList ddl = sender as DropDownList;
string myValue = "";
if (ddl != null)
{
myValue = ddl.SelectedValue;
// Do some stuff
}
}
这没有奏效。当选定的索引被更改后,它只是重新加载页面,但IsPostBack标志始终为false。
所以我通过SO筛选并尝试了许多不同的策略。最近,我尝试在代码隐藏中注册客户端onChange事件,并关闭AutoPostBack。
在ASP.Net页面:
<asp:DropDownList ID="myDDL" runat="server" AutoPostBack="false"></asp:DropDownList>
在代码隐藏
:
myDDL.Attributes.Add("onChange", "doSomeStuff(this);"); // Done on databind.
我增加了客户端JavaScript调用网页的__doPostBack功能
<script language="javascript" type="text/javascript">
function doSomeStuff(ddl) {
var ddlVals = document.getElementById(ddl.id);
__doPostBack(ddlVals, '');
}
</script>
这也失败了,虽然我认为这是去某个地方,当我看到JavaScript正常执行。
但是,在代码隐藏中,它仍然无法正常工作。当我在Page_Load中放置断点时IsPostBack为false!但它应该是一个回传!?它使用__doPostBack和(单独地)自动地使用AutoPostBack =“true”来发布回去
所以我挖得更深。
根据此MSDN文章(http://msdn.microsoft.com/en-us/library/ms178141(v=VS.85).aspx)根据页面加载结果我做了一个“服务器传输”而不是所需的回传(IsPostBack为false,正如预期的那样,PreviousPage是应回发的同一页面,IsCallback为false,IsCrossPagePosting为false)。
可能会发生什么事情来劫持AutoPostBack和__doPostBack,使其看起来像“服务器转移”一样?
我可以设置/检查父控制 /页面以确保它允许回传?
编辑:
在Page_Load看起来是这样的:在//set some variables
页面
private SpecialDataObject _someData;
private string foobar;
public void Page_Load(object sender, EventArgs e)
{
//set some variables.
this.foobar = "blah";
LoadSomeUnrelatedData();
if (!IsPostBack)
{
if (_someData == null)
{
LoadDataWithoutBinding();
}
BindMyData();
}
}
具有断点。即使在AutoPostBack之后,IsPostBack始终为false。
编辑2:
答案是在服务器转移。在从母版页加载的远程控件中,该URL会在它到达页面之前被检查并重新路由,这有效地否定了我的回发。之前我没有看到它,因为我只在目标页面中添加了断点。
我们可能需要查看Page_Load的有限形式,以帮助您了解正在发生的事情。 –
我在page_load大纲中添加了@jmein。 BindMyData成功绑定数据。 – Peach