总是听见有很多人说,要尽量避免使用服务器控件和替换服务器控件,现在发个贴来征集所有的避免使用和替换使用服务器控件的方法。请各位高手踊跃发表意见,谢谢!

解决方案 »

  1.   

    这种东西企业级的项目是无所谓的,可能反而多用服务器控件交互性会更好.
    门户级的因为访问量,性能,带宽的要求.应该是尽量用HTML控件代替.
    我就是不知道你要征集什么?
      

  2.   

    就比如说用HTML控件怎么替换服务器控件?用HTML控件怎么保持数据的交互
      

  3.   

    只有在能直接写文字在网页里面而不干,非要拖个Label控件,这才叫作过度使用服务器控件。
      

  4.   

    就好像很多人在讨论说ViewState要还是不要问题。关键还是在于合理运用。没有什么错与对的。合理才是关键
      

  5.   

    事物总是有两面的!信息综合网站,像 GridView 这样的“重量级”控件,页面大小(viewstate)会成为响应的瓶颈,
    通常会选择 Repeater 轻量级的,几乎是完全自定义的控件逻辑来呈现数据列表(如新闻)而应用型系统,更在乎的性能主要在稳定性、可靠性,由于 Gridview 的丰富功能,很多直接选择之,开发效率高,
    但是当需要瓶颈突破的时候,它会成为问题关键看你关注点至于“现在发个贴来征集所有的避免使用和替换使用服务器控件的方法”,没有必要盲目的替换,需要考虑实际应用场景,
    总体原则是,开发进度允许下,尽量不用runat=server,使用轻量级控件,甚至你会使用内联代码(asp/php类似)
    没有runat=server的控制,或者盲目禁用ViewState,都会带来“莫名其妙”的问题,提供工作量。对于新手,你的首要目标是,让你程序RUN起来!
      

  6.   

    使用服务器控件会造成一些服务器资源的浪费,用户每访问一次服务器都得新建一个对象,在流量大的时间特别能体现出来,所以一般都用html控件
      

  7.   

    如果我要实现一些数据交互,用html控件怎么实现数据交互
      

  8.   

    其实我还没有见过自己发明了一种套想相当于asp.net或者winForm工具箱中的所有工具组件的人,后来在做应用时完全放弃自己的工具箱,每一次做项目都重新从底层开始重复写那些组件的代码的。不用工具的人,大多都是没有做过工具箱,更没有做商品化组件出售过。做过自己的工具箱用来做项目,或者自己做过商品化组件卖钱,不会随便诋毁别人的工具。
      

  9.   

    当你拥有类似 Infragistics NetAdvantage for ASP.NET 或者其它平台的工具箱时,做应用很容易赚到钱,可以说你的意见肯定坚持不改变。如果是另一个极端,什么也没有,怎么说都无所谓,此时持什么态度就很难说了。微软给了很多咨询师小钱让他们宣传,微软的咨询师很多都不是微软开发人员,但是被外界误认为是微软的人,他们写的文章代表微软的意见。这也是微软市场策略的副作用。
      

  10.   

    使用VSTS做了一个测试,结果和大家想象的相反两个页面:TitleListWithoutGridView.aspx:<%@ Page Language="C#" AutoEventWireup="true"%>
    <%@ Import Namespace="System.Data.SqlClient" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <table>
        <table cellspacing="0" rules="all" border="1" id="GridView1" style="border-collapse:collapse;">
    <tr>
    <th scope="col">Id</th><th scope="col">Title</th><th scope="col">Author</th><th scope="col">PublishDate</th><th scope="col">UnitPrice</th>
    </tr>
        <%
            SqlConnection con = new SqlConnection(@"Server=.\sqlexpress;database=MyBookShop;trusted_connection=true");
            SqlCommand command = new SqlCommand("Select top 100 Id,Title,Author,PublishDate,UnitPrice from books", con);
            con.Open();
            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
        %>
    <tr><td><%=reader[0]%></td><td><%=reader[1]%></td><td><%=reader[2]%></td><td><%=reader[3]%></td><td><%=reader[4]%></td></tr>
        <%
            }
            reader.Close();
            con.Close();
        %>
        </table>
        </div>
        </form>
    </body>
    </html>TitleListWithGridView.aspx:
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="TitleListWithGridView.aspx.cs" Inherits="TitleListWithGridView" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <asp:GridView ID="GridView1" runat="server">
            </asp:GridView>
        
        </div>
        </form>
    </body>
    </html>TitleListWithGridView.aspx.cs
    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using System.Data.SqlClient;public partial class TitleListWithGridView : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            GridView1.EnableViewState = false;
            BindData();
        }    private void BindData()
        {
            SqlConnection con = new SqlConnection(@"Server=.\sqlexpress;database=MyBookShop;trusted_connection=true");
            SqlDataAdapter da = new SqlDataAdapter("Select top 100 Id,Title,Author,PublishDate,UnitPrice from books", con);
            DataSet ds = new DataSet();
            da.Fill(ds, "Books");
            GridView1.DataSource = ds.Tables[0];
            GridView1.DataBind();
        }
    }测试结果经过了预编译之后,两个页面单次运行的响应时间如下:
    TitleListWithoutGridView.aspx : 48ms
    TitleListWithGridView.aspx:     28ms
    (每次运行不一样,但几乎总是差一倍)在使用25个用户进行,10次跌代负载测试,得出的响应时间结果:
    TitleListWithoutGridView.aspx : 
    平均:2.40秒 最小:2.39秒 最大:2.41秒
    TitleListWithGridView.aspx:
    平均:0.045秒 最小:0.042秒 最大:0.052秒时间关系,没有测试内存占用情况
    仅供参考
      

  11.   

    不想用服务器控件又想享用asp.net的交互功能?
    举一个最极端的例子,这个例子中我们只用到一个LinkButton lb,一个HiddenField hf,只有它们是服务器控件。
    而所有postback都由这个lb产生。
    比如说这是一个登录页面。用户在客户端控件中填完用户名(username)和密码(password),然后单击客户端控件submit按钮。
    然后为submit的onclick事件写上一堆js:
    var hfvalue;
    hfvalue+="username="+$get(username).value+";";
    hfvalue+="password="+$get(password).value+";";
    hv.value=hfvalue;
    __doPostBack('lb','');然后在服务器端触发了lb_Click事件,又要写一堆逻辑拆解hfvalue里面的值,得到username和password。
    几乎所有的asp.net页面都可以用这种方式实现,无论页面多大,都只用两个服务器控件。但是你受得了吗?
      

  12.   

    呵呵。。在下不是什么高手。。只是知道少用服务器端控件罢了。可以做一整套控件。。如果没那个实力的话。。那还是用服务器端控件(我想大部分的CSDN的人还没到自己写控件这个程度吧)。。有空我会公布我写的控件。请你关注我的博客
      

  13.   

    遗憾的告诉你。。你还是新手。请继续用服务器控件。。如果MS的思路和你一样。。那MS早破产了。。哎
      

  14.   


    其实你才是新手,什么是你所谓的“垃圾代码”?你知道为什么要产生你那些所谓的“垃圾代码吗”?而且非常遗憾地告诉你,NET 类库中  System.Web.UI.WebControls 命名空间下面大部分没用到反射,
    我想你都不知道对象的序列化和反序列化吧?如果你说有用到反射,请你说说哪些服务器控件用了反射。
      

  15.   

    OK?那请问你用过DataBinder.Eval。。知道它性能杂样。。请问这位高手说出来听听。。
      

  16.   

    不用服务器控件,
    说白了就是直接输出HTML元素与js代码,用Request来接收值
    我喜欢用HTML元素,当需要直接访问时,改为runat=server即可其实任何服务器控件,最终要转换为HTML字符串输出的
    你完全可以自己输出,但是用什么方式很重要
    象25楼那样asp的方式是会降低效率
    至少要用个StringBuilder吧,一气呵成拼好字符串再输出~
      

  17.   

    System.Web.UI.Control.Render 方法是可以重写的 (override)
      

  18.   

    跑题了。。OK。。如果我这个85年的小弟说错话。。在这里说声Sorry
      

  19.   

    具体情况具体分析!比如安全性要求高的地方如果你用html+js验证的话,别人禁用了js脚本你还有什么安全性可言,但服务器端验证控件就可以在客户端和服务器端两次验证!这样安全性更高更值得信赖!
      

  20.   


    服务器控件会产生一些垃圾代码..服务器那么好用..是给新手用的..而且服务器控件用了许多反射..大家也知道反射会影响性能..大家还是多用客户端控件.. 
    OK?那请问你用过DataBinder.Eval。。知道它性能杂样。。请问这位高手说出来听听。。呵呵,难度你认为 DataBinder 是你所说的“服务器控件”?
    诚然 DataBinder 是使用反射来进行数据绑定,使用反射是影响性能,但是你有比这更好的方法来进行数据绑定吧?我想你没有,如果你有,那你就不会说那些什么“服务器控件会产生一些垃圾代码..服务器那么好用..是给新手用的..而且服务器控件用了许多反射..”。
    而且你知道什么时候才会执行 DataBinder.Eval 吗? 难道你认为使用了服务器控件就会执行?所以才认为服务器控件用了许多反射?
    呵呵
      

  21.   

    关注,顶
    还是没看出答案在什么地方我理解的是管理后台用控件,客户访问的前台写函数拼成HTML输出,如果要交互的话少量的服务器控件加AJAX或者干脆做成ASP的方法来实现
      

  22.   


    哈哈,fanliang11 竟然说 服务器控件用了许多反射,
    我说很少用到反射,他竟然以DataBinder.Eval 这个方法来反驳我。
    哈哈,他连服务器控件和DataBinder.Eval 是什么关系都不知道。
      

  23.   

    请教Viena,在asp.net页面中,你指的“asp方式”是什么意思?我也想问,asp.net中是否还会有"asp方式",哈哈
      

  24.   


    asp方法就是在aspx文件中直接把服务器代码放在<%%>标记中,让编译器解释执行.....
      

  25.   


    aspx 中的 <%%>也是编译执行的。Viena 的asp方式是指,服务器代码和html混合,用循环来分页
      

  26.   

    应用层面不同而已,拖控件总比在html代码里直接画div定位快,所以关键是看你用在哪里。
      

  27.   

    我是用的基本全是HTML控件+div+AjaxPro
      

  28.   

    楼主要搞清楚,人家说法的用意
    1、一般是服务器控件滥用,导致的问题,比如无需跟服务器交互的一些标签,如Label,Panel等等的滥用
    2、服务器控件,需要解析后返回客户端的html代码,如果非必要情况下,当然没有必要去使用服务器控件,以减少解析带来的性能损失。
    3、合理使用服务器控件,也是你要掌握的内容。如GridView\DataList\Repeter控件的合理使用等等。
    4、要相信一点,功能封装越多的控件,其性能是越来越低的,所以有时候,自己写控件是个不错的做法。
    ……
      

  29.   

    1.网页初始化时,通过javascrpt调用服务器端方法,获取网页的代码,
    2.在服务器端方法中组装网页要显示的内容,这样会非常容易控制HTML代码内容,如显示哪些控件,ID是多少,值是什么,布局如何等,甚至可以把服务器端控件的事件指向更改掉,让它直接调用javascript中自己定义的代码,而不是javascript:__doPostBack(调用服务器端代码)
    3.然后再返回给javascript方法,
    4.然后再通过div将这些网页内容赋值给div。
      

  30.   

    抱歉,前边的测试可能有些片面,我也感觉意外。更充分的测试表明,使用GridView和不使用任何服务器控件显示数据相比,的确执行时间更长,大约相差1/4 - 1/3
    但我们必须得承认,使用控件开发代表了一种先进的网页开发技术,这种技术有效的提升了开发效率。一方面不能只是一味的追求运行效率而弃之不用,另一方面,要学会合理的使用。附带说一下,asp.net兼容asp,但是绝对不存在所谓的“asp方式”,不敢苟同楼上大侠的论断。aspx页面中内迁的asp.net代码将被转译为方法调用,并且也将编译执行。在上边页面中包含的代码,将最终翻译为Response.Write调用。
      

  31.   

    在一些特殊场景下,可能无法直接使用现有服务器控件的某些功能。为了提高搜索引擎的收录概率,我在实现一个模拟静态页面的时候遇到这个问题。没有办法直接使用gridview的分页器,因为它的分页器是通过postback触发换页事件的,而模拟静态页面要改成链接的形式
      

  32.   

    说穿了还是把握"度"的问题...
    服务端控件需要在服务端实例化对象,对象上还绑定了若干事件,肯定是比你用request通吃..占用的资源多.
    需要交互的地方适当用服务器控件.不需要交互,仅仅是呈现的东西,用HTML标签.就是比较完美的组合了.没有必要刻意去走两个极端.就象4楼讲的那样,显示字符串的地方跑去拖个label控件,这样才会明显降低你页面的效率.
    而数据层现控件什么的,只要你用得得当,再配合缓存.也是有利无弊的.
    不要事事都钻牛角尖,非要指出哪种好哪种不好来.
      

  33.   

    不用服务器控件,用asp去把。倒退10年。
      

  34.   

    不想用服务器控件又想享用asp.net的交互功能? 作为新手来说,我现在只是学到怎样使用服务器控件,并且觉得它很强大或许它对程序性能来说有好大影响...但在开发效率和功能上应该挺强大的吧
      

  35.   

    你用用MVC模式, 比较一下就明白了
      

  36.   

    我是禁用ViewState的
    因为我相当熟悉浏览器对象模型JS和IIS访问机制。在.net开发中,充分利用控件是好事情,但是如果不能修改控件达到自己的需求,就要动用JS大法了,前提是研究好浏览器模型  的各种对象的方法属性。尤其是熟悉CSS+HTML就会做的很酷。就C#语言本身来说要求不高。  
        
      1,动态删除Table  里面内容技巧,不需要写太多代码,一行:  
      tb.removeNode(true)  
        
      2,动态增加行,除了CreateElement方法,还可以这样比较短小:  
        
      <table  id=tb1> </table>  
      <SCRIPT>  
      function  addTable(){  
            var  row1  =  tb1.insertRow();    
            var  cell1=row1.insertCell();  
            var  cell2=row1.insertCell();  
            cell1.innerText="灰豆宝宝";  
            cell2.innerText="超级大笨狼"  
      }  
      </SCRIPT>      
      <INPUT  TYPE  =  "button"  VALUE  =  "AddTable"  onclick  =  "addTable()">  
        
      3,在DIV中动态增加Table  
        
      <SCRIPT>  
      function  addTable(){  
            var  tb1  =  document.createElement("table");  
            tb1.border="1px";  
            var  row1  =  tb1.insertRow();    
            var  cell1=row1.insertCell();  
            var  cell2=row1.insertCell();  
            mydiv.appendChild(tb1);  
            cell1.innerText="wanghr100";  
            cell2.innerText="panyuguang962"  
      }  
      </SCRIPT>  
      <BODY>  
      <div  id=mydiv  style="width:400;height:300;"> </div>  
      <INPUT  TYPE  =  "button"  VALUE  =  "AddTable"  onclick  =  "addTable()">  
        
      4,在DIV中删除Table,简单只要Div.innerHTML=""就可以。  
        
      以上是部分实用相对短小的代码,当然有其他各种办法实现,不过一般都比上面的长,比如组合使用DIV对象的insertAdjacentHTML  方法等,在不同需要下使用不同方法,前提是研究好浏览器模型  的各种对象的方法属性。尤其是熟悉CSS+HTML就会做的很酷。就JS语言本身来说要求不高。  
      
    5,如果是IE浏览器,想创建什么就创建什么。 
    Div.insertAdjacentHTML("afterBegin",HTML); 6, 
    select  操作最简短版  
      <select  id=s> </select>  
      <button  onclick="add()"  >添加 </button>  
      <button  onclick="remove()"  >删除 </button>  
        <SCRIPT  LANGUAGE="JavaScript">  
        function  add()  
        {  
        for(i=0;i <3;i++)  
        {  
      var  op=  new  Option("text"  +  i,  "value"  +i);    
      s.options[s.options.length]  =  op;  
      }  
      }  
        function  remove()  
        {  
      s.options.length=0;  
          
      }  
        </SCRIPT> 最快速删除所有  option  的方法:  
      document.formName.selectName.options.length  =  0;    //就这么简单 
      以下是以Document对象为例,相关方法有:  
        
      Method  Description    
      attachEvent    
      createAttribute          
      createComment        
      createDocumentFragment      
      createElement      
      createEventObject      
      createStyleSheet      
      createTextNode      
      detachEvent    
      getElementById        
      getElementsByName      
      getElementsByTagName    
      mergeAttributes  
      recalc    
      write        
      writeln      
      以DIV对象为例相关方法有:  
      addBehavior      
      appendChild      
      applyElement      
      attachEvent    
      clearAttributes  
      cloneNode    
      contains      
      detachEvent  
      getAdjacentText          
      getAttribute        
      getAttributeNode    
      getElementsByTagName    
      hasChildNodes      
      insertAdjacentElement      
      insertAdjacentHTML      
      insertAdjacentText    
      insertBefore  
      mergeAttributes    
      normalize  
      removeAttribute      
      removeAttributeNode        
      removeBehavior    
      removeChild    
      removeExpression    
      removeNode    
      replaceAdjacentText    
      replaceChild    
      replaceNode    
      setActive    
      setAttribute    
      setAttributeNode    
      setExpression        
        
      其他,比如下拉列表对象,和拖拽操作等我有时间也整理比较一下,实现相同功能,相对比较短的精彩代码是值得收藏的。