DropDownList не постит обратно, даже с установленным AutoPostBack

Непонятное решение в конце поста

Используя страницу asp.net с C# codebehind, я успешно создал и заполнил DropDownList.

Что я хотел бы сделать, так это перехватить новое значение, выбранное из выпадающего списка (предпочтительно используя постбэк к моему codebehind). Затем кодбайнд может обновлять другие элементы на странице на основе этого нового выбранного значения выпадающего списка.

Моей первой попыткой было использование

<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 всегда был ложным.

Так что я просеял SO и попробовал несколько различных тактик. Совсем недавно я попробовал зарегистрировать событие onChange на стороне клиента в codebehind и отключил AutoPostBack.

в странице ASP.Net:

<asp:DropDownList ID="myDDL" runat="server" AutoPostBack="false"></asp:DropDownList>

в codebehind:

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 выполняется правильно.

Однако, если посмотреть в codebehind, это все еще не работает. Когда я ставлю точку останова в Page_Load IsPostBack - false! Но это должен быть постбэк!? Он был отправлен назад с помощью __doPostBack и (отдельно) автоматически с AutoPostBack="true"

Поэтому я копнул глубже.

Согласно этой статье MSDN (http://msdn.microsoft.com/en-us/library/ms178141(v=VS.85).aspx), основываясь на результатах загрузки страницы, я делаю "Передачу сервера", а не желаемый Postback (IsPostBack - false, PreviousPage, как и ожидалось, та же страница, которая должна быть отправлена обратно, IsCallback - false, и IsCrossPagePosting - false).

Что может происходить, чтобы взломать AutoPostBack и __doPostBack, чтобы заставить его выглядеть и действовать как "Передача сервера"?

Что я могу установить/проверить на родительском элементе управления/странице, чтобы убедиться, что он разрешает обратную пересылку?

EDIT:

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 Page.IsPostBack всегда false даже после AutoPostBack.

EDIT 2:

Ответ был в передаче сервера. В удаленном элементе управления, загружаемом с главной страницы, URL проверяется и перенаправляется до того, как он попадает на страницу, эффективно сводя на нет мой постбэк. Я не заметил этого раньше, потому что добавил точки останова только на целевой странице.

5
задан Peach 14 November 2011 в 12:29
поделиться