12

我正在进入 ASP.NET(C# - 我知道这对于这个特定的问题并不重要,但完全公开等等),虽然我喜欢asp:-style 控件为我节省了很多繁琐的 HTML 制作,我经常对某些行为感到沮丧。昨晚在使用 Master Pages 时遇到了一个问题:我<asp:BulletedList ID="nav"><ul id="ct100_nav">.

还有其他问题——我注意到当您自动填充 DataGrid 时,它会向结果表添加我不一定想要的属性。

我知道当您依赖框架来接管您的一些繁琐职责时,您必须接受一定数量的“约定优于配置”,但这些情况下的“约定”并不是任何既定约定,而是不必要的额外内容。我知道为什么ID 会添加前缀,但我应该能够调整和关闭这样的事情,特别是因为作为一个网络标准传播者,我不会在单个页面中复制 HTML id。

所以这里的问题是针对那些比我更有经验的 ASP.NET 开发人员:在您开发和部署应用程序的经验中,您如何利用这些控件?您是否发现自己重新使用硬编码的 HTML?你用混合物吗?我不想围绕这些控件中的特殊怪癖来设计我的 HTML,但是,如果可能的话,我想尽可能地利用它们。

男孩要做什么?

4

11 回答 11

13

亲自,

我认为标准的 ASP.NET 控件适用于内部的东西 - 在这种情况下快速而肮脏是好的。但是,我曾经与一位同时也是设计师的 Web 开发人员一起工作,他拒绝使用 ASP.NET 控件,只使用 HTML 代码并在需要时添加 runat="server" 标记。这更多是因为他想确切地知道他的 HTML 将如何呈现,而且当时无论如何,一些 ASP.NET 控件不会呈现为符合标准。

我坐在中间的某个地方 - 在适当的时候使用 HTML,而不是在不使用的时候。您可以使用CSS 控件适配器实现两全其美

于 2008-08-22T11:34:27.003 回答
13

看到这里的一些观点与我自己的观点一致,我其实很欣慰:作为模板语言的 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。

(抱歉这么久了</rant>)

于 2008-12-19T09:17:30.357 回答
4

简短的回答是,除非您有充分的理由,否则您永远不应该使用标准 HTML 控件的 asp:... 版本。

初级开发人员经常迷恋使用这些控件,因为大多数 ASP.NET 书籍都介绍了这些控件,因此假定它们一定更好。他们不是。在这一点上,经过 8 年的日常 ASP.NET 开发,我只能想到 2 或 3 种情况,使用 asp 是有意义的:... INPUT 控制而不是标准的 HTML 控制。

于 2008-12-19T08:32:45.157 回答
2

至于服务器控件上的 ID:您可以通过访问 ClientID 找到将要写入浏览器的实际 ID。这样您就可以结合服务器端 og 客户端脚本,并且仍然不必硬编码 _id="ct100_nav"_

我总是尝试使用包含的控件而不是“破解”HTML,因为如果以后有更新或一些改进,我所有的代码仍然可以通过替换框架来工作,我不必更改任何 HTML。

希望这可以帮助

于 2008-08-22T11:25:18.413 回答
2

@Brian,是的!您几乎可以控制所有行为。考虑创建自定义控件(共有三种类型)。我最近在这里的问题中对它们进行了概述。

强烈建议您检查一下,对我的帮助无穷无尽:)

于 2008-08-22T11:33:30.360 回答
1

我也在冒险进入 ASP.NET 并且也遇到过类似的挫折。但是,您很快就会习惯它。您只需要记住,您没有繁琐的 HTML 制作的原因是因为 ASP.NET 控件为您完成了所有工作

在某种程度上,您可以控制/调整这些东西,即使这意味着继承控制并从那里调整 HTML 输出。

过去我不得不这样做,默认情况下某些控件没有通过 W3C 验证,通过在这里和那里放置一些额外的标记,所以我只是根据需要覆盖和编辑(一个修复太字面意思是几分钟)..

我想说了解控制系统的工作原理。然后自己敲几个,这真的帮助我了解引擎盖下发生的事情,所以如果我遇到任何问题,我知道去哪里。

于 2008-08-22T11:22:55.330 回答
1

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

于 2008-08-22T12:40:18.513 回答
0

如果 ASP.NET 添加的 ID 前缀是您以后使用 JS 或其他东西访问它们的问题......您有 .ClientID 属性服务器端。

如果 ASP.NET 增加了开销,您应该考虑使用 ASP.NET MVC(仍然是预览版),您可以完全控制发出的 html。

我正在转向 MVC,因为我也不喜欢添加的所有东西......

于 2008-08-22T11:30:28.477 回答
0

我认为这里的大多数答案都是从设计师的角度来看的。在中小型项目中,同步代码和 CSS/HTML 并使它们符合标准和干净似乎是一种开销。设计人员的方法是完全控制呈现的 HTML。但是有很多方法可以在 ASP.NET 中实现完全控制。对我来说,在 aspx/ascx 文件中包含所需的 HTML 是最不可扩展和最肮脏的方式。如果您想通过 CSS 设置控件样式,您始终可以通过 CssClass 属性在服务器端设置一个类。如果您想通过 JS 访问它们,您可以再次在服务器端发出具有正确 ID 的 JS。这提供的唯一缺点是开发人员和设计师必须密切合作。无论如何,在任何大型项目中,这都是不可避免的。但是ASP的优势。NET 提供的这些困难要多得多。尽管如此,如果您想要符合标准的 HTML、皮肤支持和其他好东西来控制呈现的标记,您总是可以使用第三方控件。

于 2008-08-22T12:31:18.863 回答
0

正如 Dave Ward 已经提到的,“这是 ASP.NET 防止 ID 冲突的方法。”

一个很好的例子是,如果您尝试将控件放入自定义控件中,然后在转发器中使用该自定义控件,这样自定义控件的 HTML 将在页面中多次输出。

正如其他人所提到的,如果您需要访问 javascript 控件,请使用 ClientScript 属性,该属性将使您能够访问 ClientScriptManager 并以这种方式将您的脚本注册到页面。确保在编写脚本时使用您尝试引用的控件上的 ClientID 属性,而不是仅仅键入控件的 ID。

于 2008-12-19T08:23:17.797 回答
0

如果您想对呈现的 HTML 进行如此多的控制,请改为查看ASP.NET MVC

于 2009-07-24T20:22:58.923 回答