List添加Item時, 如何去判斷某個欄位, 並且保證欄位資料不重複性

來源:互聯網
上載者:User
資料|重複 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[i].title == "Employee ID"){

fldValue = frm.form.elements[i].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 + "&FieldValue=" + fldValue,false);

xmlhttp.send();

//擷取返回資訊

var resp = new String(xmlhttp.responseText);

//如果返回資訊包含表示錯誤的標籤則改變程式流程

if(resp.indexOf("</ERROR>") > 0)

return fal



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。