做了幾年的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中去。
我的同事拷貝My Code過去,點擊>按鈕,頁面事件沒有任何反應,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,統一管理索引值對,減少出錯。