帖子末尾隐藏的解决方案
使用带有C#codebehind的asp.net页面,我已经成功构建并填充了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是假的!但它应该是一个回发!?它是使用__doPostBack和(单独)使用AutoPostBack =“true”自动回发的所以我深入挖掘。
根据这篇MSDN文章(http://msdn.microsoft.com/en-us/library/ms178141(v=VS.85).aspx)根据页面加载的结果我正在做一个“ Server Transfer“而不是所需的Postback(IsPostBack为false,正如预期的那样,PreviousPage是应该回发的同一页面,IsCallback是false,IsCrossPagePosting是false)。
可以发生什么骚扰AutoPostBack 和__doPostBack使它看起来像一个“服务器转移”?
我可以设置/检查父控件 /页面以确保它允许回发?
修改
Page_Load看起来像:
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();
}
}
在//set some variables
处有一个断点,即使在AutoPostBack之后,Page.IsPostBack也总是为假。
编辑2:
答案在服务器转移中。在从母版页加载的远程控件中,URL会在到达页面之前进行检查和重新路由,从而有效地否定了我的回发。之前我没有看到它,因为我只在目标页面中添加了断点。
答案 0 :(得分:5)
我会检查以确保您没有在某处干扰回发的验证。要检查这一点,请在DropDownList上将CausesValidation
设置为false。
答案 1 :(得分:3)
您是否重置了PageLoad中下拉列表的值?
此外,您可能需要考虑使用 UpdatePanel ,以便它不会重新加载整个页面。
答案 2 :(得分:0)
它在UpdatePanel中吗?如果是,请设置ChildrenAsTriggers =“true”
答案 3 :(得分:0)
根据您提到的尝试以及有关更新面板的评论,我尝试了一些方法。
通过在load事件上设置数据源,您只需执行一次:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//set up data here
}
}
您可以使用Page.IsPostBack代码和您的方法来获得您想要的内容:
if (Page.IsPostBack)
{
//do page reload logic in here
}
protected void foo(object sender, EventArgs e)
{
//get your selected value here
}
(注意:两个回发条件都在页面加载事件中)
编辑:
这是整个设置,它是基本的,但你明白了:
正如你所看到的那样,当我从一只猫到另一只狗做出选择时,它认识到有一个回发,所以它跳过了数据绑定并设置了t。我只能假设这里还有别的东西,如果你不能让它在回发中为你回归真实,我就没有看到。