另一个SelectedIndexChanged PostBack重置索引

时间:2015-03-04 18:20:39

标签: c# asp.net

我真的很讨厌,因为有很多与SelectedIndexChanged相关的类似问题没有解雇。但是,我无法想出这个。这是我的DDL:

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

我有一个母版页设置EnableViewState =“True”,它还有我的ScriptManager和表单元素。真的,这里没什么特别的。像这样,SelectedIndexChanged将会正常启动。当被任何其他元素包装时,我的问题就出现了(例如:Panel,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();

}

我没有在PostBack上重建DDL。 ViewState已启用。我知道它必须是我正在做或不做的蠢事,但我看不到它。我错过了什么?

2 个答案:

答案 0 :(得分:0)

在考虑了这个之后,我想我可能已经修改了<div><asp:Panel>之前的类似内容。我不确定问题是什么,因为它通常可以正常工作。

答案 1 :(得分:0)

感谢Steve对CSS的看法,我也删除了我正在使用的脚本库。其中一个是我的客户端验证,那里有一行:

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

强制DOM将name属性重命名为ASP控件的ID。删除当然解决了这个问题。这就是我首先使用hack进行客户端验证的结果。感谢大家一起来看看。