Control的CssClass字段在Init上更改

时间:2010-10-27 23:32:24

标签: asp.net css pageload

我正在研究别人的代码,发现了一些非常有趣的东西,并希望有人知道这是怎么回事。

在标记文件中,我放置了一个TextBox控件和一个DropDownList控件,并为它们分配了CssClass InputField的{​​{1}}更改背景颜色和其他酷的东西。

为了避免任何疑问,这里是我的声明,从IDE逐字复制粘贴:

<asp:TextBox runat="server" ID="txtCity" CssClass="InputField" />
<asp:DropDownList runat="server" ID="ddlState" CssClass="InputField" OnInit="ddlState_Init" OnLoad="ddlState_Load" />

当我执行页面时,我看到呈现的<input>具有正确的类名 但是<select>有一个类名dropdown,恰好在项目中的另一个.css文件中定义,当然它的风格与我的不同。

再一次,逐字逐句地来源:

<input name="ctl00$ctl00$BodyContentPlaceHolder$ContentPlaceHolder1$txtCity" type="text" id="ctl00_ctl00_BodyContentPlaceHolder_ContentPlaceHolder1_txtCity" class="InputField" />
<select name="ctl00$ctl00$BodyContentPlaceHolder$ContentPlaceHolder1$ddlState" id="ctl00_ctl00_BodyContentPlaceHolder_ContentPlaceHolder1_ddlState" class="dropdown"></select>

为了了解这是如何发生的,我进入了以下每个事件:

  • Page_Init
  • Page_Load
  • ddlStates_Init
  • ddlStates_Load

并为ddlStates.CssClass添加了一块手表 令我震惊的是,我发现在所有事件中,CssClass的值已更改为dropdown

这么早改变班级名称的原因是什么? 我不知道有关覆盖这样的值的事情吗?
即使某些 更改了值,它是否可以在控件的Init事件本身之前执行此操作?

FYI :页面类不是从任何页面基类继承的 - 只是直接System.Web.UI.Page

仅供参考:我通过添加随机属性确认我 正在查看正确的ddlStates实例,并确认它在所有中保留了该信息事件介入我做了。

感谢。

1 个答案:

答案 0 :(得分:2)

在深入挖掘之前,您需要检查一些事项。我要寻找的第一件事是皮肤/主题文件。这些文件会覆盖控件的外观以使它们保持一致,但是当您不了解它们时可能会造成严重破坏。要检查这一点,只需查看页眉或浏览任何皮肤文件。

Here是一个链接,其中包含有关皮肤/主题文件的更多信息。

从主题设置优先顺序部分的上述来源:

  

如果您设置了网页的主题属性,   控制主题和设置   页面合并形成最终   控件的设置。如果一个控件   设置在控件中定义   和主题,控制设置   从主题覆盖任何页面   控件上的设置。这个策略   使主题创建一个   即使在页面上也能保持一致的外观   已经拥有的页面上的控件   个人财产设置。对于   例如,它允许您应用   您在一个页面中创建的主题   早期版本的ASP.NET。

     

或者,您可以应用主题   作为样式表主题通过设置   page的StyleSheetTheme属性。在   这种情况下,本地页面设置采取   优先于那些定义的   定义设置时的主题   这两个地方。这是使用的模型   级联样式表。你可能会   将主题应用为样式表主题   如果你想能够设置   单个控件的属性   仍在应用主题的页面   总的来说。

如果那不是问题,那么我建议暂时更改下拉列表的名称,以确保它没有以编程方式播放。如果失败了,那就开始漫长而艰苦的调试艰难之路。