在我们的一个页面上,有一个下拉列表,可以在预渲染时动态着色其项目。但是,只要页面上的任何控件都有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,因此只返回。
答案 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调用中很明显......