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