ASP.NET开发两年多,谈谈对两三年工作经验的ASP.NET程序员的基本见解
我想众所周知,Microsoft的东西入门都是比较简单的,但是提高并不容易,这也就导致了很多培训机构借此良机,忽悠了大批的甚至对编程压根不知所以然的人加入.NET的开发阵营,然后告诉他们包教,包会,包就业的三包政策。当然也有另一部分人是受过高等教育,之后出来从事.NET开发工作,但是他们或者也是受到了一些环境的影响,在WEBFORM的开发模式中,很喜欢托拉控件,编辑模板之类的操作,甚至不知道这些控件最终被解析成什么东西,只知道我实现了,而不问其所以然,或者是效率如何,等等。
下面谈谈几点个人愚见,希望能对两三年工作经验的.NET开发人员一点提醒:
1、Gridview之错,错,错
我想从事ASP.NET开发工作的应当有相当一部分人是做基于信息管理系统类软件开发的,这样一来可能就会经常与数据报表打交道,Gridview这个东西可能就是在熟悉不过了。但是我想不通的是为什么有这么多的人喜欢用它呢?我总结了这种控件的缺点,如下:
(1)糟糕的编辑环境,看不见TR,TD,写样式也变得异常麻烦
代码
<asp:GridView ID="gvList" runat="server" CssClass="GridViewCSS" Width="100%" AutoGenerateColumns="False" EmptyDataText="No Data">
<Columns>
<asp:TemplateField HeaderText="行号">
<ItemTemplate>
<asp:Label ID="lblRowId" runat="server" Text='<%# Container.DataItemIndex +1%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="XXX1" HeaderText="XXX1" />
<asp:BoundField DataField="XXX2" HeaderText="XXX2" />
<asp:BoundField DataField="XXX3" HeaderText="XXX3" />
<asp:BoundField DataField="XXX4" HeaderText="XXX4" />
<asp:BoundField DataField="XXX5" HeaderText="XXX5" />
<asp:BoundField DataField="XXX6" HeaderText="XXX6" />
<asp:BoundField DataField="XXX7" HeaderText="XXX7" />
<asp:BoundField DataField="XXX8" HeaderText="XXX8" />
</Columns>
</asp:GridView>
(2)有人甚至喜欢在模板列里面编辑,我看着就一个字晕
(3)生成糟糕的HTML标签
(4)Gridview操作起来很不灵活
这句话的意思是我想要方便的控制Table的TR,TD,譬如在合并单元格,等等很多问题的处理上很不方便,以下是我用Repeater在处理合并单元格的问题的实例:
HTML部分:
代码
<asp:Repeater ID="rpList" runat="server" EnableViewState="false">
<HeaderTemplate>
<%
if (rpList.Items.Count == 0)
{
%><div id="dNoData">No Data</div><%
}
else {
%>
<table>
<tr>
<th>XXX1</th>
<th>XXX2</th>
<th>XXX3</th>
<th>XXX4</th>
<th>XXX5</th>
<th>XXX6</th>
<th>XXX7</th>
</tr>
<%
} %>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td id="tdContainerNo" runat="server" ><%#Eval("ContainerNo")%></td>
<td><%#Eval("X1")%></td>
<td><%#Eval("X2")%></td>
<td><%#Eval("X3")%></td>
<td><%#Eval("X4")%></td>
<td><%#Eval("X5")%></td>
<td id="tdtotal" runat="server"><%#Eval("X6")%></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
CS部分:
代码
for (int i = rpList.Items.Count - 1; i > 0; i--)
{
HtmlTableCell tdContainerNo_previous = this.rpList.Items[i - 1].FindControl("tdContainerNo") as HtmlTableCell;
HtmlTableCell tdContainerNo = this.rpList.Items[i].FindControl("tdContainerNo") as HtmlTableCell;
HtmlTableCell tdtotal_previous = this.rpList.Items[i - 1].FindControl("tdtotal") as HtmlTableCell;
HtmlTableCell tdtotal = this.rpList.Items[i].FindControl("tdtotal") as HtmlTableCell;
tdContainerNo.RowSpan = (tdContainerNo.RowSpan == -1) ? 1 : tdContainerNo.RowSpan;
tdContainerNo_previous.RowSpan = (tdContainerNo_previous.RowSpan == -1) ? 1 : tdContainerNo_previous.RowSpan;
if (tdContainerNo.InnerText == tdContainerNo_previous.InnerText)
{
tdContainerNo.Visible = false;
tdContainerNo_previous.RowSpan += tdContainerNo.RowSpan;
}
tdtotal.RowSpan = (tdtotal.RowSpan == -1) ? 1 : tdtotal.RowSpan;
tdtotal_previous.RowSpan = (tdtotal_previous.RowSpan == -1) ? 1 : tdtotal_previous.RowSpan;
if (tdContainerNo.InnerText == tdContainerNo_previous.InnerText && tdtotal.InnerText == tdtotal_previous.InnerText)
{
tdtotal.Visible = false;
tdtotal_previous.RowSpan += tdtotal.RowSpan;
}
}
(5)Gridview生成的效率问题
Gridview集成了这么多的东西,我想在效率上,应该也好不到哪里去吧。
最后:当然Gridview还有诸多其他问题,这里就不一一列举了,这里只列举几个最常见得问题,让我想不通的是,有些人像Repeater这么简单易用的控件,为什么不用,而去用Gridview这种不易掌控的控件呢?
2、为啥还有人用FormView
有些人喜欢在设计界面的时候托一个FormView控件,然后在里面放一些Textbox、Button、Label之类的服务器端控件,这样在后台操作的时候可以统一绑定,而后呢如果会经常有一些方法,要操作FormView中的服务器端控件,那么经常有些程序员会声明很多局部变量,先从FormView去Findcontrol这些服务器端控件赋给这些全局变量,而后去再操作这些全局变量,如下CODE:
//声明部分
private TextBox X1;
private TextBox X2;
private DropDownList X3;
private TextBox X4;
private TextBox X5;
private TextBox X6;
//赋值部分
看到这样的CODE真是让人无语,而且更让人无语的是,这些人仿佛很喜欢在模板列里面编辑内容。
3、疯狂的SQL 代码拼接
虽然说在在MS SQL 2005以后的版本中,对很长的SQL代码的执行效率,比执行由这段SQL生成的存储过程的时间多的有限,但是我们知道,存储过程是预先编译好的存放在数据库中的,你要调用它,只需要传一个很短的字符串,加N个参数而已。而超长的SQL代码呢,你需要预先将其拼接成要执行的SQL 代码(SQL代码很长,要分为很多行写),然后传到数据库中,数据库要将其编译(可能会编译出错,你这个时候才知道),然后在执行这段SQL代码。你别说我还真见到过很多人是这样写的,为什么不一句存储过程了事呢,改起来也很方便。
4、恐怖的viewstate
有些.NET程序员压根对viewstate不知其所以然,甚至在用webform的过程中,对其开发生成的HTML源码视而不见,下面我们来看看viewstate产生的乱码:
