即使设置了AutoPostBack,DropDownList也不会回发

时间:2011-11-11 20:55:16

标签: c# asp.net postback

帖子末尾隐藏的解决方案

使用带有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会在到达页面之前进行检查和重新路由,从而有效地否定了我的回发。之前我没有看到它,因为我只在目标页面中添加了断点。

4 个答案:

答案 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
}

(注意:两个回发条件都在页面加载事件中)

编辑:

这是整个设置,它是基本的,但你明白了:

enter image description here

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