Я действительно ненавижу спрашивать, так как существует так много похожих проблем, связанных с тем, что 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 включен. Я знаю, что это должно быть что-то глупое, что я делаю или не делаю, но я не вижу этого. Что мне не хватает?
2 ответа
Подумав об этом, я думаю, что некоторое время назад я мог исправить что-то подобное, переключив <div>
на <asp:Panel>
. Я не уверен, в чем проблема, хотя обычно он работает нормально.
Благодаря идее Стива о CSS я также удалил библиотеки скриптов, которые использовал. Один из них предназначен для моей проверки на стороне клиента, и там была строка:
$.each($('div').children(), function() {
$(this).attr("name", $(this).attr("id"));
});
Это заставляет DOM переименовать атрибут name в идентификатор элемента управления ASP. Удаление этого, конечно, решило проблему. Это то, что я получаю в первую очередь за использование хака для проверки на стороне клиента. Спасибо всем, кто посмотрел на это.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
page_load
и изменить индекс DDL, посмотрите, попадет ли он сначала в функцию загрузки.