讨论内容:
Html控件与Web控件的区别.
如何正确使用它们.

解决方案 »

  1.   

    1.NET 中常用的WEB 表示层控件分为HTML 控件和WEB 服务端控件,位于System.WEB.UI.Htmlcontrols  和System.WEB.UI.Webcontrols2.HTML 控件和WEB 服务端控件的区别,对于WEB 开发所解决的问题是在WEB(Http)的模式下面,接受用户的交互,生成给客户端的
    HTML字符流.但是对于HTML 控件和WEB 服务端控件在服务器端来说,就有了不同的实现方式,HTML 控件相当于普通的HTML 元素,
    服务器在编译解释的时候,也没有做任何的处理 .但是对于HTML 控件来说可以通过将其转换为服务端的控件来实现服务器端在后台
    程序中访问,实现部分和WEB 服务端控件相同的功能.
    WEB 服务端控件则是很强大的能参与服务器端编成的控件,它的属性很多,能购在WEB 页面被请求的时候被访问到,在服务器内存中
    存在具体的变量实例.缺点是占用系统资源有没有runat="server" 是判断能不能被服务器端访问的标志,一个服务端控件在建立的时候就有,HTML 控件只有在被转换为服务端
    控件后才增加了这样的标志,并有了一个ID(但是不能使用事件编程_在服务端)
    所以根据系统需求动态的调整页面的可视控件.何时采用HTML 控件,何时采用WEB 服务端控件,将方便和性能统一起来,这个视很重要的但是一些强大的WEB服务器端控件则是只能通过服务端来实现,并且结合,NET 后台强大的累库,实现完美的数据操作功能.
      

  2.   

    呵呵,明天又是很忙的。htmlcontrol也是服务器控件,它也是继承自System.Web.UI.Control的,与WebControl的一样。html控件与web控件都是服务器控件。实际上,用户控件也是服务器控件。总的来说,htmlcontrol比功能类似的wecontrol都要简单。不过,html仍然参与页面对服务器控件的生命周期控制的全过程,例如它仍然是有ViewState,会触发服务器端的事件代码等。如果说web控件相对于没有runat=server的html对象而言,对系统资源的消耗是100:1,那么html控件对客户端html对象的比是80:1。其实,就是其他服务器控件与literalcontrol服务器控件之比。实际上,普通的html对象如果不写上runat=server,那么多个这样的对象会打包到一个literalControl控件中。因此即使没有runat=server你也可以在服务器端动态访问和改变他们的内容,只不过要自己取出相应的literalControl的Text属性,然后修改它(用正则表达式分解出待修改的html对象),就能操纵输出结果。但是如果写上了runat=server,那么每一个html对象会被重新解析为所对应的特殊html控件,或者htmlGenericControl。这就更能在服务端操纵它。并且这与literalcontrol不同,一个html控件对应一个html对象,不需用正则表达式解析。例如,你想用程序改变页面的标题,有希望程序代码比较OOP化的整齐易读,不喜欢绑定表达式等形式,就可以这样:
    <head>
      <title id=pageTitle runat=server />然后在代码中声明pageTitle变量,并用 page.Title.InnerText 赋值。由于 htmlGenericControl继承自htmlContainerControl,所以它甚至有InnerHTML属性。一些工作,不需要webcontrol那么多功能的时候,使用htmlControl来完成更方便于将来改进,并且有时似乎(对于比较精通html的人来说)更方便。
      

  3.   

    上面少了几个字:“不过,html仍然参与页面”  ==>  “不过,html控件仍然参与页面” 
    “page.Title.InnerText”    ==>  “pageTitle.InnerText”
      

  4.   

    到底用什么控件,并没有一定之规。有界面的不仅仅是webControl。没有界面的,也可能是服务器控件。例如写一个网页定时器控件,就从control继承就足够了。
      

  5.   

    有时候也迷惑不知道何时用htm控件,何时用web控件
    也就是说web控件要比html控件站用的资源多
    那html控件加上ruanat=server后,是不是也需要编译啊?
      

  6.   

    呵呵,我上面已经说了,不加runat=server,也是被编译进literalControl控件的。何时用不应是个问题。你都应该学习,不应该偏废。跟其它工具一样,一开始你希望所有的控件越复杂越好,将来你就会自己认为一些简单的工具反而好用。这不是绝对的。“合适用就好”!
      

  7.   

    在asp.net中,page也是从control继承来的。按照msdn上的说法,所有从control继承的都算做服务器控件。所以很多比较高级(但是可能抽象)书上也会说“Page和ascx也是一种控件”。了解控件,最根本地是动手去做,最好做一些高级的应用程序大量复用的控件(例如把这个回帖页面做到单个控件里,当然要支持编辑帖子功能,其针对的数据库和帖子的表是可以灵活指定的,这样可以用到多个不同风格的项目中),否则会被它的各种变化迷惑住。
      

  8.   

    Web 服务器控件
    Web 服务器控件是设计侧重点不同的另一组控件。它们并不一对一映射到 HTML 服务器控件,而是定义为抽象控件,控件在其中呈现的实际 HTML 与编程针对的模型可能大相径庭。例如,RadioButtonList Web 服务器控件可在表中呈现,也可呈现为其他 HTML 的文本。Web 服务器控件包括传统的窗体控件,例如按钮、文本框和表等复杂控件。它们还包括提供在网格中显示数据、选择日期等常用窗体功能的控件。除了提供 HTML 服务器控件的上述所有功能(不包括一对一映射到 HTML 元素)外,Web 服务器控件还提供以下功能: 功能丰富的对象模型,该模型具有类型安全编程功能。 
    自动浏览器检测。控件可以检测浏览器的功能,并为基本型和丰富型 (HTML 4.0) 浏览器创建适当的输出。 
    对于某些控件,可以使用模板来自定义控件的外观。 
    对于某些控件,可以指定控件的事件是立即发送到服务器,还是先缓存然后在提交窗体时引发。 
    可将事件从嵌套控件(例如表中的按钮)传递到容器控件。 
    在设计时的“HTML”视图中,显示在页中的控件的格式如下:<asp:button attributes runat="server"/>
    本例中的属性不是 HTML 元素的属性。相反,它们是 Web 控件的属性。运行 Web 窗体页时,Web 服务器控件使用适当的 HTML 呈现在页上,这通常不只取决于浏览器类型,还与对控件进行的设置有关。例如,TextBox 控件可能呈现为一个 <INPUT> 标记,也可能是 <TEXTAREA> 标记,具体取决于其属性。
      

  9.   

    HTML 服务器控件
    HTML 服务器控件是 HTML 元素,这些元素包含使其自身在服务器上可见并可编程的属性。默认情况下,服务器无法使用 Web 窗体页上的 HTML 元素;这些元素被视为传递给浏览器的不透明文本。但是,通过将 HTML 元素转换为 HTML 服务器控件,可将其公开为可在服务器上编程的元素。HTML 服务器控件的对象模型紧密映射到相应元素的对象模型。例如,HTML 属性在 HTML 服务器控件中作为属性公开。页上的任意 HTML 元素都可以转换为 HTML 服务器控件。转换是一个只涉及几个属性的简单过程。作为最低要求,通过添加 RUNAT="SERVER" 属性,HTML 元素即可转换为控件。这将在分析期间提醒 ASP.NET 页框架,它应该创建该控件实例,以便在服务器端页处理期间使用。如果要在代码中作为成员引用该控件,则还应当为控件分配 ID 属性。页框架为页中最常动态使用的 HTML 元素提供预定义的 HTML 服务器控件:窗体、HTML <INPUT> 元素(文本框、复选框、“提交”按钮等)、列表框 (<SELECT>)、表、图像等等。这些预定义的 HTML 服务器控件具有一般控件的基本属性,此外每个控件通常提供自己的属性集和自己的事件。HTML 服务器控件提供以下功能: 可在服务器上使用熟悉的面向对象技术对其进行编程的对象模型。每个服务器控件都公开一些属性,这些属性使您得以在服务器代码中通过编程操作该控件的 HTML 属性。 
    提供一组事件,您可以为其编写事件处理程序,方法与在基于客户端的窗体中大致相同,所不同的是事件处理是在服务器代码中完成的。 
    在客户端脚本中处理事件的能力。 
    自动维护控件状态。在窗体到服务器往返期间,用户在 HTML 服务器控件中输入的值将在页发送回浏览器时自动维护。 
    与验证控件进行交互,便于您验证用户是否在控件输入了适当的信息。 
    数据绑定到一个或多个控件属性。 
    如果 Web 窗体页显示在支持层叠样式表的浏览器中,则支持 HTML 4.0 样式。 
    直接可用的自定义属性。您可以将任何需要的属性添加到 HTML 服务器控件,页框架将读取并呈现它们而不更改其任何功能。这将允许您向控件添加浏览器特定的属性。