控件与标准 HTML
Posted
技术标签:
【中文标题】控件与标准 HTML【英文标题】:Controls versus standard HTML 【发布时间】:2010-09-06 12:43:56 【问题描述】:我正在进入 ASP.NET(C# - 我知道这对于这个特定的问题并不重要,但完全公开等等),虽然我喜欢 asp:
风格的控件为我节省了很多由于繁琐的 html 制作,我经常对某些行为感到沮丧。我昨晚在使用 Master Pages 时遇到了一个问题:我的<asp:BulletedList ID="nav">
,在转换为 HTML 时变成了<ul id="ct100_nav">
。
还有其他问题——我注意到当您自动填充 DataGrid 时,它会向结果表添加我不一定想要的属性。
我知道,当您依靠框架来承担一些繁琐的职责时,您必须接受一定数量的“约定优于配置”,但在这些情况下,“约定”并不是那么多任何既定的约定,而不是不必要的额外内容。我知道为什么 ID 添加了前缀,但我应该能够调整和关闭这样的东西,特别是因为作为一个网络标准的传播者,我不会在其中复制 HTML id反正只有一页。
所以这里的问题是针对那些比我更有经验的 ASP.NET 开发人员:在您开发和部署应用程序的经验中,您如何利用这些控件?您是否发现自己重新使用硬编码的 HTML?你用混合物吗?我不想围绕这些控件中的特殊怪癖来设计我的 HTML,但是,如果可能的话,我想尽可能地利用它们。
男孩要做什么?
【问题讨论】:
【参考方案1】:个人,
我认为标准的 ASP.NET 控件非常适合内部的东西 - 在这种情况下,快速和肮脏是好的。但是,我曾经与一位同时也是设计师的 Web 开发人员一起工作,他拒绝使用 ASP.NET 控件,只使用 HTML 代码,并在需要时添加 runat="server" 标记。这更多是因为他想确切地知道他的 HTML 将如何呈现,而且当时无论如何,一些 ASP.NET 控件不会呈现为符合标准。
我坐在中间的某个地方 - 在适当的时候使用 HTML,而不是在不使用的时候。您可以使用CSS control Adapters
【讨论】:
【参考方案2】:看到这里的一些观点和我自己的观点一致,我其实很欣慰:ASP.NET 作为模板语言很差。
我只想反驳这里提出的几个优点(穿上火焰装!):
Dave Ward 提到了 ID 冲突 - 这是真的,但我的处理很糟糕。我更愿意看到由 xpath 或深度 css 选择器引用的节点,而不是让 ID 实际上无用,除非推迟到像 clientID 这样的 ASP.NET 内部 - 它只会让编写 CSS 和 JS 变得毫无意义地变得更加困难。
Rob Cooper 谈到了控件是如何替代 HTML 的,所以一切都很好(解释一下,Rob 原谅我)——这不好,因为他们采用了一种现有且易于理解的语言并说“不,你必须这样做我们现在的方式”,而他们的方式非常实施得很差。例如asp:panel 在一个浏览器中呈现表格,在另一个浏览器中呈现 div!如果没有文档或执行,登录控件(以及许多其他)的标记是不可预测的。你将如何让设计师针对它编写 CSS?
Espo 写道,如果平台更改了 html,控件如何为您提供抽象的好处——这显然是循环的(它只是因为平台在变化而变化,如果我在那里只有自己的 HTML,则不需要相反)并且实际上会产生问题。如果控件要随着更新再次发生变化,我的 CSS 应该如何应对?
道歉者会说“是的,但您可以在配置中更改它”或谈论覆盖控件和自定义控件。那么我为什么要这样做?旨在解决其中一些问题的 css 友好控件包不过是无语义标记,并且不能解决 ID 问题。
使用 webform 应用程序开箱即用地实现 MVC(抽象概念,而不是 3.5 实现)是不可能的,因为这些控件将视图和控件紧密地绑定在一起。传统的网页设计师现在有一个进入障碍,因为他必须参与服务器端代码来实现曾经是 CSS 和 JS 的独立领域。我很同情这些人。
我非常同意 Kiwi 的观点,即控件允许对特定配置文件的应用程序进行一些非常快速的开发,并且我接受无论出于何种原因,一些程序员会觉得 HTML 令人不快,并且进一步认为 ASP.NET 的其他部分具有优势给你,这需要这些控制,可能物有所值。
但是,我对失去控制感到不满,我觉得在代码隐藏上处理类、样式和脚本等事情的模型是错误的倒退,我进一步觉得有更好的模板模型(为此平台实现微格式和 xslt),尽管用这些替换控件并非易事。
我认为 ASP.NET 可以从 LAMP 和 Rails 世界的相关技术中学到很多东西,在此之前我希望尽可能使用 3.5 MVC。
(抱歉拖了这么久)
【讨论】:
我认为我从未见过你的错误回答。【参考方案3】:简短的回答是,除非您有充分的理由,否则您永远不应该使用标准 HTML 控件的 asp:... 版本。
初级开发人员经常被这些控件所吸引,因为大多数 ASP.NET 书籍都介绍了这些控件,因此人们认为它们一定更好。他们不是。在这一点上,经过 8 年的日常 ASP.NET 开发,我只能想到 2 或 3 种使用 asp 的情况:... INPUT 控制而不是标准的 HTML。
【讨论】:
【参考方案4】:至于服务器控件上的 ID:您可以通过访问 ClientID 找到将要写入浏览器的实际 ID。这样你就可以结合服务器端和客户端脚本,仍然不必硬编码 _id="ct100_nav"_
我总是尝试使用包含的控件而不是“修改”HTML,因为如果以后有更新或一些改进,我的所有代码仍然可以通过替换框架而工作,我不必更改任何内容HTML。
希望对你有帮助
【讨论】:
【参考方案5】:@布莱恩, 对!您几乎可以控制所有行为。考虑创建自定义控件(共有三种类型)。我最近在我的问题here 中对它们进行了概述。
我会强烈建议检查一下,对我的帮助无穷无尽:)
【讨论】:
【参考方案6】:我也在探索 ASP.NET,也遇到过类似的挫折。不过,您很快就会习惯。您只需要记住,您没有繁琐的 HTML 制作的原因是 ASP.NET 控件为您完成了所有工作。
在某种程度上,您可以控制/调整这些东西,即使这意味着继承控制权并从那里调整 HTML 输出。
过去我不得不这样做,默认情况下某些控件没有通过 W3C 验证,通过在这里和那里放置一些额外的标记,所以我只是根据需要覆盖和编辑(一个修复太字面意思是几分钟)..
我会说了解控制系统的工作原理。然后自己敲几个,这真的帮助我了解引擎盖下发生的事情,所以如果我遇到任何问题,我知道去哪里.
【讨论】:
“ASP.NET 控件为你做这一切” - 是的,但是 所以 很糟糕 我有点不同意这一点。我试图成为一个责备程序员而不是工具的程序员。我曾让人们评论一些 ASP.NET 应用程序生成的标记是多么干净。许多标准控件都很好。只有当你非常依赖 ViewState 时,我才讨厌 ViewState。 :)【参考方案7】:HTML 使用这些 ID 呈现,因为它的 ASP.NET 防止 ID 冲突的方式。每个容器控件(例如母版页或向导控件)都将在其子 ID 上添加一个“ID_”。
对于您的项目符号列表,ListView 提供了一个很好的中间立场。您仍然可以将它绑定到数据源,但它可以让您更严格地控制呈现的 HTML。 Scott Gu 在这里对 ListView 做了一个很好的介绍:
http://weblogs.asp.net/scottgu/archive/2007/08/10/the-asp-listview-control-part-1-building-a-product-listing-page-with-clean-css-ui.aspx
【讨论】:
【参考方案8】:如果 ASP.NET 添加的 ID 前缀是您以后使用 JS 或其他东西访问它们的问题...您有 .ClientID 属性服务器端。
如果 ASP.NET 增加了开销,您应该考虑使用 ASP.NET MVC(仍为预览版),您可以完全控制发出的 html。
我正在迁移到 MVC,因为我也不喜欢添加的所有东西......
【讨论】:
【参考方案9】:我认为这里的大多数答案都是从设计师的角度出发的。在中小型项目中,同步代码和 CSS/HTML 并使它们符合标准和干净似乎是一种开销。设计人员的方法是完全控制呈现的 HTML。但是有很多方法可以在 ASP.NET 中实现完全控制。对我来说,在 aspx/ascx 文件中包含所需的 HTML 是最不可扩展和最肮脏的方式。如果您想通过 CSS 设置控件样式,您始终可以通过 CssClass 属性在服务器端设置一个类。如果您想通过 JS 访问它们,您可以再次在服务器端发出具有正确 ID 的 JS。这提供的唯一缺点是开发人员和设计师必须密切合作。无论如何,在任何大型项目中,这都是不可避免的。但是 ASP.NET 提供的优势远远超过了这些困难。 不过,如果您想要符合标准的 HTML、皮肤支持和其他好东西来控制呈现的标记,您始终可以使用第三方控件。
【讨论】:
【参考方案10】:正如 Dave Ward 已经提到的,“这是 ASP.NET 防止 ID 冲突的方式。”
一个很好的例子是,如果您尝试将控件放入自定义控件中,然后在转发器中使用该自定义控件,这样自定义控件的 HTML 将在页面中多次输出。
正如其他人所提到的,如果您需要访问 javascript 的控件,请使用 ClientScript 属性,该属性将使您能够访问 ClientScriptManager 并以这种方式将您的脚本注册到页面。确保在编写脚本时使用您尝试引用的控件上的 ClientID 属性,而不是仅仅输入控件的 ID。
【讨论】:
【参考方案11】:如果您想对呈现的 HTML 进行如此多的控制,请查看 ASP.NET MVC。
【讨论】:
以上是关于控件与标准 HTML的主要内容,如果未能解决你的问题,请参考以下文章
什么时候应该使用标准的 html 标签/输入,什么时候应该使用 asp.net 控件?