【问题标题】:Why does ASP.Net add a "border" attribute to asp:Image为什么 ASP.Net 给 asp:Image 添加一个“边框”属性
【发布时间】:2010-11-28 23:10:45
【问题描述】:

所以我有一个 asp.net 图片标签:

<asp:Image runat="server" ImageUrl="~/Images/img.jpg" width="350px" height="250px" AlternateText="My Image" />

但它正在输出:

<img src="Images/img.jpg" height="250" width="350" border="0" />

...XHTML 验证器认为“边框”元素不应该存在...但是添加它的是 ASP.Net。

这个问题我肯定之前被问过很多次了,但是为什么asp.net认为需要添加,尤其是无效??

如何避免这种情况以使其生效?

【问题讨论】:

    标签: asp.net validation xhtml


    【解决方案1】:

    这是 ASP.NET 图像 Web 控件的工作方式。不幸的是,许多内置的 ASP.NET Web 控件不符合标准,会导致页面无法验证。 CSS Friendly Control Adapters 是“修复”由内置 Web 控件生成的偶尔无效且语义不足的 HTML 的一次勇敢尝试。

    按照How to build ImageButton Control Adapter.的回答中的建议可以避免您的特定问题

    【讨论】:

    • 是的,这很容易说,但可以避免。目前我的页面因此无法验证...
    【解决方案2】:

    我同意 Dan 的观点,img 标记将使用样式而不是边框​​ =“0”呈现,但我所做的研究很少,边框 = 0 只有在您使用 img 将样式应用于控件时才会消失{border: none} 无论是在外部样式表中还是在同一页面上,魔术是如何发生的都超出了我的研究范围。但是,我注意到验证器在标记中仍然得到一个border=0,这意味着asp.net根据浏览器的类型(或我认为的浏览器代理)呈现不同的内容,为了解决这个问题,我不得不强制asp始终呈现“干净”的代码,如此处所示

    http://blog.hmobius.com/post/2010/03/03/ASPNET-Part-9-Rendering-Cleaner-HTML.aspx

    所以在我的情况下,我添加到 web.config 文件中

    <pages controlRenderingCompatibilityVersion="4.0" clientIDMode="AutoID">
    

    还有一点,我使用的是 html5 doctype,所以请确保您的页面的 doctype 不是问题。

    我的页面通过验证。

    【讨论】:

      【解决方案3】:

      默认情况下,如果&lt;img&gt; 元素出现在&lt;a&gt; 元素中,则&lt;img&gt; 会得到一个难看的蓝色边框,表示它是一个链接。

      border="0" 是一种老式(但简单、可靠且独立)的方法来防止这种情况发生。

      【讨论】:

        【解决方案4】:

        它并不总是无效的。在过去,我们都添加了边框=“0”,以避免链接图像时默认的蓝色边框。不幸的是,ASP.NET 团队认为将 Image 控件与 Web 标准一起更新并不值得。

        顺便说一句,border 属性远非 ASP.NET 发出的唯一不兼容的 HTML。

        【讨论】:

          【解决方案5】:

          您使用的是 ASP.NET 1.1 吗?因为在 2.0 及以上版本中,图像标签呈现为:

              <img src="/Images/img.jpg" alt="My Image" 
          style="height:250px;width:350px;border-width:0px;" />
          

          我刚刚对此进行了测试,上面是我得到的(使用 Opera 10),文档类型为 XHTML 1.0 Transitional。因此,我不确定您为什么会收到无效的 HTML,除非 ASP.NET 以某种方式将 detecting your browser 设置为“低级”。

          • 您使用的是什么浏览器?
          • 什么版本的 .net?
          • 你有什么文档类型?

          【讨论】:

          • 如果您将浏览器的用户代理字符串更改为例如 google bots 字符串代理,您肯定会在渲染中获得border="0" 属性。对于常见的调试/浏览不会。但不会通过 html 验证,因为验证是使用自定义用户代理完成的。
          【解决方案6】:

          border="0" 是 Netscape 4 所必需的,它不支持通常的 CSS 方式来正确执行此操作。当然,在 ASP.NET 中实际上并没有多少可以与 Netscape 4 一起使用,所以这种向后兼容的尝试是毫无意义的。

          顺便说一句,除了 ASP.NET 控件的标记很差之外,它实际上仍然会在当今时代进行浏览器嗅探:它会忽略图像按钮上相关但更无效的 'border="0"'对于它认为“好”的浏览器:不包含 HTML 验证器的白名单浏览器的选择。

          浏览器嗅探是错误的事情,我们大多数人在几年前就停止了,但 ASP.NET 默认情况下仍然会这样做,除非您在页面声明中使用上游 clientTarget 来阻止它。丑陋的东西,MS。

          【讨论】:

            【解决方案7】:

            如果您不想弄乱网络配置(就像我所做的那样),因为在渲染中定位另一个框架会影响您所有项目控件的渲染,对于大型项目,这不是一个选项,您可以随时通过在表单末尾的正文结束标记之前插入此行来使用此“页面上”解决方案(需要 jQuery):

            <script type="text/javascript">$('#yourImageId').removeAttr("border");</script>
            

            使用它不会通过 HTML 验证,我建立的验证表单的最佳方法是不使用 asp 控件,而是使用常规的 img 标签,使其可以通过 runat="server" 属性从后面的代码中访问:

            <img ID="myImage" src="Images/img.jpg" height="250" width="350" runat="server"/>
            

            此解决方案将通过 HTML 验证,您将能够从后面的代码修改图像属性。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-26
              • 2013-03-13
              • 1970-01-01
              • 2020-02-26
              • 1970-01-01
              相关资源
              最近更新 更多