List添加Item時, 如何去判斷某個字段, 並且保證字段數據不重複性
1) 希望解決方案比較簡單,並且易於部署(客戶希望在30分鐘內能完成部署)
2) 希望在部署過程中不需要重新編譯任何工程
3) 有一定的通用性,不能針對一個特定的List開發一個組件
---------------------------------------------------------------
目前研究的結果:
研究結果及解決方案(以新建記錄爲例)
==================
系統實現思路
=======
由於所涉及的步驟牽涉修改WSS默認的模板和JavaScript代碼,所以請在測試環境中完成下述步驟並備份相關信息。
1. 當用戶新建記錄、提交表單時,WSS會首先調用ClickOnce()函數(請在新建記錄頁面點擊右鍵,查看HTML源文件),然而,ClickOnce()並不存在NewForm.ASPx文件中,而是在相應List模板的SCHEMA.XML中(如,我們使用Customized List,List模板的路徑是C:/Program Files/Common Files/Microsoft Shared/web server extensions/60/TEMPLATE/1033/STS/LISTS/CUSTLIST)且所有WSS List都會調用OWS.JS文件,引用其中的JavaScript。表單會提交到/_vti_bin/owssvr.dll上,最終插入數據庫。這是默認的表單提交過程。
2. 爲了在期間加入定製的代碼,檢查是否會產生重複數據。我們可以採取以下幾種通訊方式:
a) 在SCHEMA.XML中攔截 ClickOnce()函數,使用Microsoft.XMLHTTP對象向Server端的ASPX頁發送POST請求,並接收Server端的回傳數據,SCHEMA.XML的作用域是一個特定的List。在本樣例中,我們選用這種方式
b) 由於在提交表單的流程中,SCHEMA.XML中定義的ClickOnce()函數最終會調用OWS.JS中的程序段,雖然,我們可以在OWS.JS的有關函數中攔截默認的提交流程,並向Server端發送請求,但是,我們不推薦這種方式,因爲修改OWS.JS可能影響到多個List。只有在特定的條件下,才使用這種全局的方式,並且希望您進行全面的測試。
c) 前兩種方式是在客戶端向服務端發送請求,進行驗證,如果需要全部PostBack回服務器端進行認證,請使用FrontPage 2003,打開NewForm.ASPx,在輸入WebPart上點右鍵,並選擇“Customized SharePoint List Form”菜單項,將輸入WebPart轉換爲表格模式,如下所示:
此時我們可以使用傳統ASP.NET窗體的方式,在上面添加自定義的輸入欄位和提交按鈕,並可以提交到特定的後臺頁面。這種方式需要對每個List的NewForm.ASPX分別處理。
3. 服務器端是一個ASP.NET頁面,它將接收ListID(List的Guid)和FieldValue(需要字段填充值),ASP.NET頁面會讀取一個XML配置文件,並比對其中的ListID,用以決定是否需要對本List進行驗證(針對多個List的通用解決方案)。如果需要驗證,則從XML配置中讀取需要驗證的字段名稱等信息,並進行查詢。無論成功與否ASP.NET頁面會將返回信息回寫到客戶端。
4. 客戶端的Microsoft.XMLHTTP對象獲得回寫的字符串後進行必要的解析,並決定相應的流程。
具體實現步驟
=======
1. 本樣例中將使用Customized List模板爲例,在C:/Program Files/Common Files/Microsoft Shared/web server extensions/60/TEMPLATE/1033/STS/LISTS目錄中複製CUSTLIST目錄,並命名位LIANGMING
2. 打開上層目錄下的XML目錄(C:/Program Files/Common Files/Microsoft Shared/web server extensions/60/TEMPLATE/1033/STS/XML)中的ONET.XML,並找到<ListTemplates>片段,插入如下黑斜體部分,將Type設爲小於1000,且和當前List的Type字段沒有重複的數值,並保持Name域的信息和複製的目錄名稱相同。
<ListTemplates>
<ListTemplate Name="custlist" DisplayName="Custom List" Type="100" BaseType="0" OnQuickLaunch="TRUE" SecurityBits="11" Description="Create a custom list when you want to specify your own columns. The list opens as a Web page and lets you add or edit items one at a time." Image="/_layouts/images/itgen.gif"></ListTemplate>
<ListTemplate Name="LIANGMING" DisplayName="Liang Ming Customized List" Type="500" BaseType="0" OnQuickLaunch="TRUE" SecurityBits="11" Description="LIANG MING" Image="/_layouts/images/itgen.gif"></ListTemplate>
3. 在命令窗口中調用IISReset,重啓IIS服務
4. 在新建List頁面(任何對List模板的修改,必須新建一個List纔可以看到結果)我們會發現有個LIANGMING的List模板
5. 打開List模板目錄下的SCHEMA.XML,添加如下代碼:
function CheckField()
{
var fldValue;
for(i=0;i<frm.form.elements.length;i )
{
//查找特定字段的值(需要檢查的值),此處使用title屬性,可根據實際情況修改
if(frm.form.elements.title == "Employee ID"){
fldValue = frm.form.elements.value;
break;
}
}
//默認List的GUID存放在Hidden的onetidIOHidden字段中
var lstId = document.getElementById("onetidIOHidden");
//使用Microsoft.XMLHTTP向服務端的頁面發送請求
var XMLhttp = new ActiveXObject("Microsoft.XMLHTTP");
XMLhttp.Open("POST","/_layouts/CheckField/DoCheck.ASPx?ListID=" lstId.value "