当你拥有类似 Infragistics NetAdvantage for ASP.NET 或者其它平台的工具箱时,做应用很容易赚到钱,可以说你的意见肯定坚持不改变。如果是另一个极端,什么也没有,怎么说都无所谓,此时持什么态度就很难说了。微软给了很多咨询师小钱让他们宣传,微软的咨询师很多都不是微软开发人员,但是被外界误认为是微软的人,他们写的文章代表微软的意见。这也是微软市场策略的副作用。
</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秒时间关系,没有测试内存占用情况 仅供参考
<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()">
门户级的因为访问量,性能,带宽的要求.应该是尽量用HTML控件代替.
我就是不知道你要征集什么?
通常会选择 Repeater 轻量级的,几乎是完全自定义的控件逻辑来呈现数据列表(如新闻)而应用型系统,更在乎的性能主要在稳定性、可靠性,由于 Gridview 的丰富功能,很多直接选择之,开发效率高,
但是当需要瓶颈突破的时候,它会成为问题关键看你关注点至于“现在发个贴来征集所有的避免使用和替换使用服务器控件的方法”,没有必要盲目的替换,需要考虑实际应用场景,
总体原则是,开发进度允许下,尽量不用runat=server,使用轻量级控件,甚至你会使用内联代码(asp/php类似)
没有runat=server的控制,或者盲目禁用ViewState,都会带来“莫名其妙”的问题,提供工作量。对于新手,你的首要目标是,让你程序RUN起来!
<%@ 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秒时间关系,没有测试内存占用情况
仅供参考
举一个最极端的例子,这个例子中我们只用到一个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页面都可以用这种方式实现,无论页面多大,都只用两个服务器控件。但是你受得了吗?
其实你才是新手,什么是你所谓的“垃圾代码”?你知道为什么要产生你那些所谓的“垃圾代码吗”?而且非常遗憾地告诉你,NET 类库中 System.Web.UI.WebControls 命名空间下面大部分没用到反射,
我想你都不知道对象的序列化和反序列化吧?如果你说有用到反射,请你说说哪些服务器控件用了反射。
说白了就是直接输出HTML元素与js代码,用Request来接收值
我喜欢用HTML元素,当需要直接访问时,改为runat=server即可其实任何服务器控件,最终要转换为HTML字符串输出的
你完全可以自己输出,但是用什么方式很重要
象25楼那样asp的方式是会降低效率
至少要用个StringBuilder吧,一气呵成拼好字符串再输出~
服务器控件会产生一些垃圾代码..服务器那么好用..是给新手用的..而且服务器控件用了许多反射..大家也知道反射会影响性能..大家还是多用客户端控件..
OK?那请问你用过DataBinder.Eval。。知道它性能杂样。。请问这位高手说出来听听。。呵呵,难度你认为 DataBinder 是你所说的“服务器控件”?
诚然 DataBinder 是使用反射来进行数据绑定,使用反射是影响性能,但是你有比这更好的方法来进行数据绑定吧?我想你没有,如果你有,那你就不会说那些什么“服务器控件会产生一些垃圾代码..服务器那么好用..是给新手用的..而且服务器控件用了许多反射..”。
而且你知道什么时候才会执行 DataBinder.Eval 吗? 难道你认为使用了服务器控件就会执行?所以才认为服务器控件用了许多反射?
呵呵
还是没看出答案在什么地方我理解的是管理后台用控件,客户访问的前台写函数拼成HTML输出,如果要交互的话少量的服务器控件加AJAX或者干脆做成ASP的方法来实现
哈哈,fanliang11 竟然说 服务器控件用了许多反射,
我说很少用到反射,他竟然以DataBinder.Eval 这个方法来反驳我。
哈哈,他连服务器控件和DataBinder.Eval 是什么关系都不知道。
asp方法就是在aspx文件中直接把服务器代码放在<%%>标记中,让编译器解释执行.....
aspx 中的 <%%>也是编译执行的。Viena 的asp方式是指,服务器代码和html混合,用循环来分页
1、一般是服务器控件滥用,导致的问题,比如无需跟服务器交互的一些标签,如Label,Panel等等的滥用
2、服务器控件,需要解析后返回客户端的html代码,如果非必要情况下,当然没有必要去使用服务器控件,以减少解析带来的性能损失。
3、合理使用服务器控件,也是你要掌握的内容。如GridView\DataList\Repeter控件的合理使用等等。
4、要相信一点,功能封装越多的控件,其性能是越来越低的,所以有时候,自己写控件是个不错的做法。
……
2.在服务器端方法中组装网页要显示的内容,这样会非常容易控制HTML代码内容,如显示哪些控件,ID是多少,值是什么,布局如何等,甚至可以把服务器端控件的事件指向更改掉,让它直接调用javascript中自己定义的代码,而不是javascript:__doPostBack(调用服务器端代码)
3.然后再返回给javascript方法,
4.然后再通过div将这些网页内容赋值给div。
但我们必须得承认,使用控件开发代表了一种先进的网页开发技术,这种技术有效的提升了开发效率。一方面不能只是一味的追求运行效率而弃之不用,另一方面,要学会合理的使用。附带说一下,asp.net兼容asp,但是绝对不存在所谓的“asp方式”,不敢苟同楼上大侠的论断。aspx页面中内迁的asp.net代码将被转译为方法调用,并且也将编译执行。在上边页面中包含的代码,将最终翻译为Response.Write调用。
服务端控件需要在服务端实例化对象,对象上还绑定了若干事件,肯定是比你用request通吃..占用的资源多.
需要交互的地方适当用服务器控件.不需要交互,仅仅是呈现的东西,用HTML标签.就是比较完美的组合了.没有必要刻意去走两个极端.就象4楼讲的那样,显示字符串的地方跑去拖个label控件,这样才会明显降低你页面的效率.
而数据层现控件什么的,只要你用得得当,再配合缓存.也是有利无弊的.
不要事事都钻牛角尖,非要指出哪种好哪种不好来.
因为我相当熟悉浏览器对象模型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
其他,比如下拉列表对象,和拖拽操作等我有时间也整理比较一下,实现相同功能,相对比较短的精彩代码是值得收藏的。