“aspNetDisabled”类在哪里定义,为啥 ASP.NET 会为它呈现干扰性的重复 CSS“类”属性?

Posted

技术标签:

【中文标题】“aspNetDisabled”类在哪里定义,为啥 ASP.NET 会为它呈现干扰性的重复 CSS“类”属性?【英文标题】:Where is the "aspNetDisabled" class defined and why does ASP.NET render an interfering duplicate CSS "class" attribute for it?“aspNetDisabled”类在哪里定义,为什么 ASP.NET 会为它呈现干扰性的重复 CSS“类”属性? 【发布时间】:2011-07-29 10:01:38 【问题描述】:

当我将 ASP.NET TextBox 控件的“Disabled”属性设置为 false 时,最终呈现的 html textarea 标记(发送到浏览器)除了 'disabled= 之外还包括一个 'class="aspNetDisabled"' 属性“禁用”属性。 “aspNetDisabled”类是在哪里定义的?

在我看来,它没有在任何地方定义,真正的杀手是这个无用的类干扰了我定义的类,因为 ASP.NET 将它作为重复的 CSS 类属性呈现到控件中:

<textarea [...] disabled="disabled" class="aspNetDisabled" class="boxsizingBorder largeinput">

其他人可以确认这个错误吗?


附加信息

IIS 版本: 7.0.6000.16386AppPool .NET Framework 版本: v4.0 ASPX 页面中的服务器控件标记:

<asp:TextBox ID="txtInput1" class="boxsizingBorder largeinput" runat="server" TextMode="MultiLine"></asp:TextBox>.

【问题讨论】:

您使用的是什么版本的 ASP.NET?您可以发布您的原始标记和代码吗? 对于读者来说,完整的答案在标记答案的 cmets 中。在 ASPX 标记中使用的正确 ASP.NET 属性是“CssClass”。 "class" 属性将被视为自定义属性,尽管使用它是有效的并且它是呈现给 HTML 的最终属性,但 ASP.NET 呈现引擎将无法将它与它自己呈现的 "class" 版本合并" 属性值。 也许使用继承和/或标签映射? leedumond.com/blog/… 【参考方案1】:

当您对 asp.net 中的任何控件使用 Enabled="false" 时,它会自动将 css 类“aspNetDisabled”与该控件绑定。如果您不想使用自动提供的类,您可以在 .cs 文件的第一步使用下面的代码行来实现这一点。

System.Web.UI.WebControls.TextBox.DisabledCssClass = "CLASS_NAME_WHICH_YOU WANT_TO_APPLY";

// 或者你可以把它留空 // 在上面的代码行中,我为 TextBox 控件完成了此操作。如果你想申请其他控制,你也可以这样做:-

System.Web.UI.WebControls.CheckBox.DisabledCssClass = "CLASS_NAME_WHICH_YOU WANT_TO_APPLY";

【讨论】:

【参考方案2】:

可能有 Visual Studio 框架问题。 解决方案是您必须选择创建项目的框架。 要更改框架,请按照步骤。

1) 右键单击​​特定项目 -> 属性页。

2) 选择构建。 3) 改变目标框架。

【讨论】:

【参考方案3】:

乍一看,这似乎是(糟糕的)设计

https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.supportsdisabledattribute.aspx

如果控件的 SupportsDisabledAttribute 属性为 false 并且 控件被禁用时,ASP.NET 设置控件的类属性 将 HTML 元素呈现为 WebControl.DisabledCssClass 的值 财产。 WebControl.DisabledCssClass 的默认值 属性是“aspNetDisabled”。为 禁用控件,您必须为该类定义一个 CSS 规则 由 WebControl.DisabledCssClass 属性的值表示。 为控件呈现的 HTML 元素可能超过 如果其 CssClass 中有一个值,则在其类属性中有一个值 财产。有关详细信息,请参阅 DisabledCssClass 属性。

奇怪的是,我在同一个网页中同时看到 disabled="disabled" 和 class="aspNetDisabled" : https://www.dropbox.com/s/sv47x7yoqdzkzh4/Screenshot%202016-10-24%2018.24.16.png?dl=0 我有一个禁用的面板,它似乎将 disabled="disabled" 添加到其所有呈现的子项(包括 DropDownList 的子项),但我碰巧明确设置为 Enabled="False" 的 ListBox 除外,这似乎得到 class="aspNetDisabled"。当我启用父面板时,这些列表框在呈现时仍然使用 class="aspNetDisabled" (而不是像 DropDownList 似乎使用的 disabled="disabled" )并且用户可以在其中选择一个项目(它们没有被禁用)。

所以它看起来确实像 ListBox 控件的一个错误,可能它将“SupportsDisabledAttribute”设置为 false,而 DropDownList 必须将其设置为 true。如果是这样,这很愚蠢,因为它们最终都呈现为“select”,ListBox 仅使用“size=4”默认显示 4 个项目

【讨论】:

破坏最小意外规则 不要太在意非禁用外观,但如果它与其他控件保持一致会很好。最初开始调查它,因为这些 ListBoxes 在 android/ios 中显示为 DropDownLists,但后来发现了真正的原因 - 似乎 WebKit 不尊重移动设备上 HTML 中“select”的“size”属性:forums.htmlhelp.com/index.php?showtopic=19066 - 那个问题最有可能发生与禁用状态无关,但是当我尝试将其作为解决方法检查时,遇到了 aspNetDisabled" 和 disabled="disabled" 都存在于同一页面中的问题【参考方案4】:

我最终执行了以下操作,这有效地删除了禁用项目的额外类的插入。

void Application_Start(object sender, EventArgs e)

    // Code that runs on application startup
    WebControl.DisabledCssClass = "";

【讨论】:

【参考方案5】:

那是因为 controlRenderingCompatibilityVersion。 如果您的框架版本高于 4,则此属性将默认设置为 "页面控件渲染兼容性版本="4.0"

更改控件RenderingCompatibilityVersion="3.5" 你可以看到 class="aspNetDisabled" 将从 html 中删除。

【讨论】:

这应该是答案【参考方案6】:

小心,在 .net 4.5 中生成的 html 发生了变化:

disabled="disabled"

不会一直存在,因此请使用“aspNetDisabled”或为 javascript 或 css 定义的 DisabledCssClass。

【讨论】:

示例:【参考方案7】:

对于可能仍在寻找这个的任何人,我们可以在 Global.asax 中的 Application_Start 期间定义这个 css 类:

void Application_Start(object sender, EventArgs e)

    WebControl.DisabledCssClass = "customDisabledClassName";

来源:WebControl.DisabledCssClass Property (MSDN)

【讨论】:

【参考方案8】:

你可能想看看这个:

http://msdn.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmltextarea.aspx

首先,没有“类”属性。这是一个 HTML 控件;如果您想要服务器端访问,则需要添加 runat="server" 属性。有一个“禁用”属性。还有一个“样式”属性。

您能否准确解释您正在尝试做什么以及为什么不使用 TextBox 而将 TextMode 属性设置为多行?

【讨论】:

我已经在使用 TextBox Web 控件 (System.Web.UI.WebControls.TextBox)。 runat="server" 属性在 ASPX 源文件中设置。我在 ASPX.CS 服务器端代码文件中使用 Disabled 属性(将其设置为 false)。我正在描述 ASP.NET 为 TextBox Web 控件(FireFox -> View Page Source)呈现并提供给浏览器的 HTML。提供的最终 HTML 包含一个重复的类属性,该属性覆盖了我的。一种解决方法是将静态 TextBox.DisabledCssClass 设置为空字符串,因此它将停止呈现重复的类属性。 您是否尝试将 Visible 设置为 false? 尝试 CssClass 而不是类。我让它在 FX4 中正常工作 好的。所以错误是,虽然标签上的自定义属性是允许的,并且被传播到最终渲染的 HTML,但渲染引擎没有考虑指定自定义标签也是渲染标签的情况,并且它无法合并价值。出于性能原因,这可能被忽略了,但 IMO 正确支持自定义标签,因为它声称这样做,它应该处理通过尝试将它们合并到单个属性值或在最少有明确定义的优先规则。 因此,最好坚持使用特定于 ASP.NET 控件的 CssClass 属性,以保持属性呈现过程尽可能纯粹,因为使用自定义属性可能会产生干扰。

以上是关于“aspNetDisabled”类在哪里定义,为啥 ASP.NET 会为它呈现干扰性的重复 CSS“类”属性?的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse:Java,查看类在哪里使用

为啥包含 main 方法的类在 Java 中不需要是公共的? [复制]

为啥我的电影类在创建电影实例时遇到问题?

Flutter源码中Te​​xt小部件的RenderObject类在哪里

为啥结构必须与模板类在同一个命名空间中才能编译?

为啥 pull-right 类在 bootstrap 版本 4.1.0 上不起作用? [复制]