当ajax回发发生时,下拉列表丢失项目样式

时间:2015-12-02 14:19:22

标签: c# css asp.net ajax

在我们的一个页面上,有一个下拉列表,可以在预渲染时动态着色其项目。但是,只要页面上的任何控件都有ajax回发,它就会立即丢失所有样式(项目颜色)。我可以看出,在页面最初加载时以及每次调用任何ajax时都会调用预呈现。

<asp:DropDownList ID="DeviceObjectDDL" runat="server" Style="width: 350px;" OnPreRender="ColorDeviceListItems" AutoPostBack="true" OnSelectedIndexChanged="DeviceObjectDDL_SelectedIndexChanged" />

    protected void ColorDeviceListItems(object sender, EventArgs e)
    {
        if (((DropDownList) sender).DataSource == null) return;
        var disabledList = ((List<Device>) ((DropDownList) sender).DataSource).FindAll(d => !d.Active || !d.Visible);

        foreach (var device in disabledList)
        {
            var item = ((DropDownList) sender).Items.FindByValue(device.ID.ToString());
            if (item == null) continue;
            if ((!device.Active) && (!device.Visible))
                item.Attributes.CssStyle.Add("color", "Purple");
            else
            {
                if (!device.Active)
                    item.Attributes.CssStyle.Add("color", "Blue");
                if (!device.Visible)
                    item.Attributes.CssStyle.Add("color", "#8B0000");
            }
        }
    }

在ajax请求期间调用ColorDeviceListItems方法时,sender数据源为null,因此只返回。

1 个答案:

答案 0 :(得分:1)

第1步

而不是使用PreRender事件,而是使用DataBound事件 - 这应该确保在视图状态重新实现数据源之后触发事件。

<asp:DropDownList ID="DeviceObjectDDL" runat="server" Style="width: 350px;" OnDataBound="ColorDeviceListItems" AutoPostBack="true" OnSelectedIndexChanged="DeviceObjectDDL_SelectedIndexChanged" />

第2步

而不是使用发件人,这可能是导致回发发生的任何事情。使用控件本身的标识符,即;而是DeviceObjectDDL。它已经使用runat="server"正确标记,您可以在后面的代码中直接访问它。

protected void ColorDeviceListItems(object sender, EventArgs e)
{
    if (DeviceObjectDDL.DataSource == null) return;
    var disabledList = ((List<Device>)(DeviceObjectDDL.DataSource).FindAll(d => !d.Active || !d.Visible);

    foreach (var device in disabledList)
    {
        var item = DeviceObjectDDL.Items.FindByValue(device.ID.ToString());
        if (item == null) continue;
        if ((!device.Active) && (!device.Visible))
            item.Attributes.CssStyle.Add("color", "Purple");
        else
        {
            if (!device.Active)
                item.Attributes.CssStyle.Add("color", "Blue");
            if (!device.Visible)
                item.Attributes.CssStyle.Add("color", "#8B0000");
        }
    }
}

在这种特定情况下,依赖发件人不是最佳做法,因为无法保证发件人是所需的控件。这一点在AJAX调用中很明显......