当前位置: 首页 > news >正文

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产生的乱码:

http://www.jsqmd.com/news/1130002/

相关文章:

  • Umi-OCR:你的离线文字识别终极解决方案,300%效率提升的秘密
  • 如何永久保存微信聊天记录:WeChatMsg完整数据资产化指南
  • Gin-Vue-Admin代码生成器终极指南:5个技巧解决字段编辑难题
  • 3分钟搞定Ventoy主题美化:让你的启动U盘颜值翻倍
  • 3个技巧让你的普通鼠标在macOS上变身生产力神器
  • 从系统级事件处理到双指数平滑算法:重新定义macOS鼠标体验的技术架构
  • 如何在断网环境下高效提取图片文字?这款免费离线OCR工具帮你提升300%工作效率
  • WinClean终极指南:如何用40+脚本让Windows系统飞起来
  • 如何在断网环境下快速提取图片文字?这款离线OCR工具让你效率翻倍
  • 静态网站分析报告:Instatic流量与用户行为数据完整指南
  • 催化剂机器学习数据集技术演进:从OC20到OC25的革命性跨越与AI驱动范式转移
  • 从大坝建设到微波通信:BPA 如何推动太平洋西北地区电力与通信变革?
  • Surveyor:终极Rails问卷生成工具,5分钟快速集成到你的应用
  • GDSDecomp PCK文件智能修改方案深度解析:90%性能提升的最佳实践
  • 如何用ER-Save-Editor打破《艾尔登法环》存档设备限制:一份完整的技术指南
  • 终极指南:如何用Mermaid Live Editor快速创建专业图表
  • SickGear高级配置指南:自定义关键词过滤与质量控制技巧
  • 终极指南:3步完成SCAIL-2 AI绘画模型从下载到ComfyUI部署
  • SCAIL-2模型入门指南:3步搞定ComfyUI扩散模型部署
  • 4步终极指南:用OpenCore Legacy Patcher轻松升级老Mac系统
  • 《从零构建大模型》实战指南:LoRA微调与Transformer优化
  • 容器池化技术:让LLM沙盒性能飙升10倍的秘密武器
  • CANN文档-IsNullptr函数
  • 3个步骤让你的旧款Mac焕发新生:OpenCore Legacy Patcher完全指南
  • 快速上手Shopware 6:终极开源电商平台搭建指南
  • OWASP ZAP 2.15.0 进阶配置:3种扫描模式与策略调优实战(以DVWA为例)
  • nnU-Net智能医学影像分割系统架构深度解析与端到端解决方案
  • 猫抓浏览器插件:轻松下载网页视频资源的终极指南
  • 揭秘MMPose:为什么这个开源工具箱正在重新定义姿态估计的边界?
  • 如何通过Open Catalyst项目掌握催化剂机器学习:从OC20到OC25的完整指南 [特殊字符]