Я действительно ненавижу спрашивать, так как существует так много похожих проблем, связанных с тем, что SelectedIndexChanged не срабатывает. Однако я не могу понять это. Вот мой ДДЛ:

<asp:DropDownList runat="server" ID="ddlPart1Country" 
CssClass="form-control" 
AutoPostBack="true" 
OnSelectedIndexChanged="ddlPart1Country_SelectedIndexChanged" />

У меня есть настройка мастер-страницы EnableViewState="True", а также мой ScriptManager и элемент формы. На самом деле здесь нет ничего необычного. При этом SelectedIndexChanged будет работать нормально. Моя проблема возникает при обертывании любым другим элементом (например, панелью, div и т. д.). Мой DDL запускает PostBack, но индекс не изменяется, поэтому не запускает событие SelectedIndexChanged.

Таким образом, он не изменит индекс, например:

<div class="row">
    <div class="form-group">
        <label for="ddlPart1Country" class="col-sm-3 control-label">Country<i class="required"></i></label>
        <div class="col-sm-4">
            <asp:DropDownList runat="server" ID="ddlPart1Country" CssClass="form-control" AutoPostBack="true" OnSelectedIndexChanged="ddlPart1Country_SelectedIndexChanged" />
        </div>
    </div>
</div>

Идентичный элемент управления DDL, единственное отличие заключается в его размещении в div.

А вот мой код:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        FillPart1Countries();
}

protected void FillPart1Countries()
{
    var lstOptions = CacheValues.Countries;

    if (lstOptions == null)
    {
        return;
    }

    ddlPart1Country.Items.Add(new ListItem(" -- Select Your Country -- ", ""));
    foreach (var option in lstOptions.Result)
    {
        ddlPart1Country.Items.Add(new ListItem(option.Ctry, option.GENC0));
    }
}
protected void ddlPart1Country_SelectedIndexChanged(object sender, EventArgs e)
{
    if (ddlPart1Country.SelectedItem.Value == "")
        return;

    var lstOptions = FormPopulation.GetStatesAndProvences(ddlPart1Country.SelectedItem.Value);



    ddlPart1StateOrProvence.Items.Clear();
    ddlPart1StateOrProvence.Items.Add(new ListItem(" -- Select Your State/Provence -- ", ""));
    foreach (var option in lstOptions.Result)
    {
        ddlPart1StateOrProvence.Items.Add(new ListItem(option.Name, option.GENC1));
    }

    lblCountrySelected.Text = ddlPart1Country.SelectedItem.Text;
    upnlPart1State.Update();

}

Я не перестраиваю DDL на PostBack. ViewState включен. Я знаю, что это должно быть что-то глупое, что я делаю или не делаю, но я не вижу этого. Что мне не хватает?

0
J. Horn 4 Мар 2015 в 21:20
Вы уверены, что он не стреляет? попробуйте поставить точку останова в самом начале page_load и изменить индекс DDL, посмотрите, попадет ли он сначала в функцию загрузки.
 – 
Banana
4 Мар 2015 в 21:26
Не то чтобы это проблема, но это ваш полный код? Я не вижу ddlPart1Country_SelectedIndexChanged.
 – 
tdbeckett
4 Мар 2015 в 21:29
Я уверен, что он не срабатывает, потому что я установил точку останова на Page_Load, и он работает за пределами
. И извините, я забыл ddlPart1Country_SelectedIndexChanged.
 – 
J. Horn
4 Мар 2015 в 22:35

2 ответа

Подумав об этом, я думаю, что некоторое время назад я мог исправить что-то подобное, переключив <div> на <asp:Panel>. Я не уверен, в чем проблема, хотя обычно он работает нормально.

0
Banana 4 Мар 2015 в 21:52
1
Может ли что-то в классе css сбивать его?
 – 
Steve
4 Мар 2015 в 22:48
Это была хорошая идея протестировать без моего CSS. Однако это ничего не изменило. Но пока я этим занимался, я решил попробовать и без своих скриптов. Разве вы не знаете, что у меня есть средство проверки формы на стороне клиента, которое переименовывает сгенерированные ASP атрибуты «имя» в значения ID="...". Удаление этой строки решило это. Спасибо за эту идею!
 – 
J. Horn
4 Мар 2015 в 23:06

Благодаря идее Стива о CSS я также удалил библиотеки скриптов, которые использовал. Один из них предназначен для моей проверки на стороне клиента, и там была строка:

$.each($('div').children(), function() {
    $(this).attr("name", $(this).attr("id"));
});

Это заставляет DOM переименовать атрибут name в идентификатор элемента управления ASP. Удаление этого, конечно, решило проблему. Это то, что я получаю в первую очередь за использование хака для проверки на стороне клиента. Спасибо всем, кто посмотрел на это.

0
J. Horn 4 Мар 2015 в 23:11