0

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

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

为避免任何疑问,这是我的声明,从 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改变了值,它可以在控件的事件本身 之前做到这一点吗?

仅供参考:页面类不是从任何页面基类继承的——只是直接的System.Web.UI.Page

仅供参考:我通过添加一个随机属性来确保我正在查看正确的ddlStates实例,并验证它在我所做的所有事件步骤中都保留了该信息。

谢谢。

4

1 回答 1

2

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

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

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

如果设置页面的 Theme 属性,则主题中的控件设置与页面合并,形成控件的最终设置。如果在控件和主题中都定义了控件设置,则主题中的控件设置会覆盖控件上的任何页面设置。此策略使主题能够跨页面创建一致的外观,即使页面上的控件已经具有单独的属性设置。例如,它允许您将主题应用于您在早期版本的 ASP.NET 中创建的页面。

或者,您可以通过设置页面的 StyleSheetTheme 属性将主题应用为样式表主题。在这种情况下,当在两个地方都定义了设置时,本地页面设置优先于主题中定义的设置。这是级联样式表使用的模型。如果您希望能够设置页面上各个控件的属性,同时仍然应用主题以获得整体外观,则可以将主题应用为样式表主题。

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

于 2010-10-27T23:53:13.890 回答