DropDownList не отправляет обратно, даже с установленным AutoPostBack - PullRequest
5 голосов
/ 12 ноября 2011

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

Используя страницу 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 всегда был ложным.

Поэтому я перебрал 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) на основе результатов загрузки страницы я выполняю «передачу на сервер», а не желаемую обратную передачу (IsPostBack имеет значение false, PreviousPage, как и ожидалось, является тем жестраница, которая должна отправлять сообщения назад, IsCallback - false, а IsCrossPagePosting - false).

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

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

РЕДАКТИРОВАТЬ:

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

РЕДАКТИРОВАТЬ 2:

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

Ответы [ 4 ]

5 голосов
/ 12 ноября 2011

Я бы проверил, чтобы убедиться, что у вас нет проверки где-то, что мешает обратной передаче. Чтобы проверить это, установите CausesValidation в false в DropDownList.

3 голосов
/ 12 ноября 2011

Сбрасываете ли вы значение раскрывающегося списка в PageLoad?

Также вы можете подумать об использовании UpdatePanel , чтобы он не перезагружал всю страницу.

0 голосов
/ 12 ноября 2011

На основании упомянутых вами попыток , а также комментариев относительно панели обновления я попытался сделать несколько вещей.

Установив источник данных для события загрузки, вы сделаете это только один раз:

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.Я могу только предположить, что здесь есть что-то еще, чего я не вижу, если вы не можете заставить это когда-либо возвращать истину для вас при обратной передаче.

0 голосов
/ 12 ноября 2011

Это внутри UpdatePanel? Если да, установите ChildrenAsTriggers = "true"

...