2011-11-11 46 views
4

在后的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会在它到达页面之前被检查并重新路由,这有效地否定了我的回发。之前我没有看到它,因为我只在目标页面中添加了断点。

+0

我们可能需要查看Page_Load的有限形式,以帮助您了解正在发生的事情。 –

+0

我在page_load大纲中添加了@jmein。 BindMyData成功绑定数据。 – Peach

回答

4

我会检查以确保你没有验证干扰回发的地方。要检查这一点,请在DropDownList上将CausesValidation设置为false。

3

您是否重置PageLoad中的下拉列表的值?

此外,您可能还想考虑使用UpdatePanel,以便它不会重新加载整个页面。

+0

是的,它被重新绑定在page_load上,但仅仅是因为它在回复后没有将IsPostBack设置为true。如果IsPostBack设置为true,我可以避免重置下拉列表...对我来说就像一个Catch-22。此外,关于UpdatePanel的好处,但是我有一些实际的页面逻辑被执行,所以在这种情况下,UpdatePanel不适合我。 – Peach

+0

@Peach这很奇怪,应该将IsPostBack设置为true。但是,即使您拥有如此复杂的页面逻辑,您仍然可以使用UpdatePanel。之前我已经做了好几次,它使页面更加用户友好。 –

0

它是否在UpdatePanel中?如果是,请设置ChildrenAsTriggers =“true”

+0

不,它不是。 UpdatePanel在我的特定情况下并不合适,虽然在一般情况下可能会有用。 – Peach

0

根据您提及的尝试,以及关于更新面板的意见,我尝试了几件事情。

通过设定的负载事件中的数据源,你只会做一次:

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 
} 

(注:两个回传条件句在页面加载事件)

编辑:

这里的整个设置,它的基本的,但你的想法:

enter image description here

正如你可以看到,当我从猫到狗做了一个选择,但它认识到有一个回传,所以它跳过了数据绑定和设置。我只能假设在这里还有别的东西,我没有看到如果你不能在回发中让它回归真实。

+0

不知道我跟着你。通过“加载事件”你的意思是Page_Load或其他东西?如果page_load,我已经在绑定数据源之前检查了IsPostBack,但IsPostBack总是假的,所以它总是被反弹...... – Peach

+0

我为你发布了SS /澄清。 – KreepN

+0

对,不幸的是,'别的'我不明白:) – Peach

相关问题