做了几年的ASP.NET,积累了不少小技巧。但是技巧只适合于特定的环境,还不如加强对基础知识的理解与运用。下面是我的一点体会,与大家分享。
1 母版页
这个控件可以使我忘记html的iframe之类的页面框架方案,还有frameset.
asp开发中还支持<#include file=”head.asp>
现在有母版页可以轻松的以.NET的方式来进行编写页面。
1) 在母版页对应的内容页中,查找母版页中的控件 ,并给它赋值
MasterPage.FindControl(“lblTitle”)=”New Request”
2) 母版页中使用JavaScript,取到文本控件的值,验证它是否合法
’<=txtUserName.ClientID>’
2 User Control 不常用,但是有时候会用到。比如,为了统一不同用户的页面地址,把不同角色的页面放到User Control中,而在同一个页面中,根据当前登陆的用户判断,加载不同的User Control
新建立二个文件,PM.ascx, GM.ascx分别对应于角色是PM和GM时的页面,在页面中作如下判断
UserControl uc
swith(role)
{
case “PM”
uc=(UserControl) LoadControl(“~/PM.ascx”); break;
case ‘GM”
uc=(UserControl) LoadControl(“~/GM.ascx”); break;
}
placeHolder.Controls.Add(uc);
placeHolder是在页面上放置的一个PlaceHolder控件。
3 数据源控件 用法举例
把数据库的字段绑定到DropDownList 控件中
<asp:DropDownList ID="ddlEndCustomer" runat="server" Width="130" DataTextField="ShortName"
DataValueField="ShortName" DataSourceID="sqlEndCustomer">
</asp:DropDownList>
<asp:SqlDataSource ID="sqlEndCustomer" runat="server" ConnectionString="<%$ ConnectionStrings:HTSystemConnectionString %>"
SelectCommand="SELECT LTRIM(RTRIM([ShortName])) [ShortName] FROM [Customer] "> </asp:SqlDataSource>
再来一个XmlDataSource
<asp:DropDownList ID="ddlPartResin" runat="server" Width="130" DataSourceID="xmlLedgerAcc" DataTextField="Text" DataValueField="Value">
</asp:DropDownList>
<asp:XmlDataSource ID="xmlLedgerAcc" DataFile="~/App_Data/PartResin.xml" runat="server" XPath="Items/Item"></asp:XmlDataSource>
Xml文件格式如下
<?xml version="1.0" encoding="utf-8" ?>
<Items>
<Item Text="ABS" Value="ABS"></Item>
<Item Text="HIPS" Value="HIPS"></Item>
<Item Text="PA" Value="PA"></Item>
</Items>
对于ObjectDataSource,用的不熟练,没有在项目开发中使用。SqlDataSource 也很少直接用于GridView的数据绑定,数据库中的数据,通常需要转换一下,用这个控件还要重新写代码,还不如直接写代码来的方便。
举例,数据库中有一个字段,smallint类型,1表示男,0表示女。用程序判断一下才可以绑定到控件中去。SQL写法如下
SELECT Sex=CASE WHEN Sex=1 THEN ‘Man’
WHEN Sex=0 THEN ‘Woman’
END
FROM Employee
4 资源文件
通常要放置一些提示字符串,比如“操作成功”,“新增业务订单失败”之类的,分散在各个类中,不好管理,也不容易统一风格。用资源文件可以有效的解决这个问题
新建2个文件,Strings.aspx.en-us.resx,Strings.aspx.resx
在文件里面写明字符串资源的值的键,在页面的后台代码中调用
Bitmap img = (System.Drawing.Bitmap)GetGlobalResourceObject(
"MyGlobal", CultureInfo.CurrentCulture.Name);
(string)GetGlobalResourceObject("MyGlobal", "GlobalText");
(string)GetLocalResourceObject("lbl.Text");
如代码所示,可以从全局的资源文件或局部资源文件中取出相应的资源,可以是字符串,也可以是图片
5 验证控件
<asp:TextBox ID="txtUserName" runat="server" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="RequiredFieldValidator" Display="None" ControlToValidate="txtUserName"></asp:RequiredFieldValidator>
验证用户名是必须输入的,否则不允许提交
如果你用了验证控件,页面上的按钮的默认属性CausesValidation=true,每一个按钮是会触发验证的。
上周帮忙同事看一个问题,如下图
这是选择用户的页面,点击>按钮把员工添加到右边的ListBox中去。
我的同事拷贝我的代码过去,点击>按钮,页面事件没有任何反应,debugger也不能中断。
我仔细检查他的页面代码,发现他使用了ASP.NET的验证控件,验证控件本身不显示错误提示,如代码所示Display="None" ,把所有的验证提示放到ValidationSummary,偏偏他的代码中又没有拷贝这个控件,所以怎么也找不到问题。我告诉他把>按钮的CausesValidation设为false,按钮开始正常工作。
6 Themes用的不多,不如在CSS文件中设置方便。
Membership虽然是可扩展的,可是MS做了那么多存储过程,关系复杂,自己很少用。
我有见过在Win Forms应用程序中,应用aspnetdb作为用户验证数据库,自己在Web开发都没有用到,居然有人在Win Forms中应用,可见它还是具有典型的意义。aspnetdb还提供了一个管理工具,可以直接添加用户,添加角色,这可以快速搭建一个角色权限数据库,验证系统用户。
Security通常是Form验证。我们公司内部局域网以域方式管理,相互信任的关系,改选用Windows验证方式,用每个电脑的Login ID作主用户名标识,当发现数据库中不存在该用户时,调出引导注册页面,让用户注册,然后管理员审核一下他的角色,赋予相应的权限就可以。
Profile也很少用,估计这东东和Portal Framework关系密切,几乎没有用。
有用户提到过一个需求,为每个输入窗体配置一些默认值,方便他快速的输入数据。因为角色是几乎不变的,要输入的数据,通常就那几个类别,我弄成DropDownList 供他选择,还不够方便,最好直接帮忙他选择一个默认值,这个默认值在80%的情况下是正确的。
估计这个功能用Profile来做会比较轻松,在新版本中考虑用这个特性来做。
6 Cache
在ASP.NET 1.1时代做过一个方案,要做一个多语言的ASP.NET应程序,把语言放置到Xml中,写成zh-cn.xml,en-us.xml,zh-tw.xml,然后在界面中读取这个文件,给界面元素赋值。
当是没有用缓存,有高人提示,这个文件的内容几乎不会变化,应该主动用文件依赖缓存,加快读取速度。
还有个争持,是用HttpContext.Cahce,还是用HttpRuntime.Cache,页面的Cache肯定是最糟糕的方案。那时我笨,也没有分清楚这两个的关系。现在你应该知道是用拿一个,否则要查一个MSDN。
上一段代码,练下手
if (Cache["key"] == null)
{
Cache.Insert("key", DateTime.Now, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);
}
DateTime dt = (DateTime)Cache["key"];
缓存的使用模式是要先判断是否存在,不存在要刷新缓存,否则直接取值
if(Cache[“Name”]==null)
Cache.Insert("Name", DateTime.Now, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);
txtUserName.Text=Convert.ToString(Cache[“Name”]);
当有大量的缓存键值对时,最好也做个CacheManager,统一管理键值对,减少出错。