List添加Item時, 如何去判斷某個字段, 並且保證字段數據不重複性

List添加Item時, 如何去判斷某個字段, 並且保證字段數據不重複性

  SharePoint中如何使得用戶不能通過對WSS的List中添加或修改使得某個指定字段存在重複數據。並需要儘可能滿足以下需求:


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   "
發佈了75 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章