2010-11-04 50 views
2

請幫忙。如何檢索Sharepoint itemadded事件中的查詢字符串

我在一個站點內有兩個不同的列表。

在一個列表中,我添加了一個querystring到新的表單,它將表示用戶的EMP_ID。在這裏,我有一個隱藏的字段「名稱」來表示用戶填寫的記錄。這個「名稱」字段是用EMP_ID值從另一個表中引用的。

以下是我的代碼:

 try 
     { 
      SPSite ohportal = new SPSite("http://moss2007dev:1234"); 
      SPWeb site = ohportal.OpenWeb(); 
      SPList vitality = site.Lists[properties.ListId]; 
      SPList employees = site.Lists["Employees List"]; 
      SPListItemCollection vitalityCollection = vitality.Items; 
      SPListItemCollection employeesCollection = employees.Items; 

      SPListItem currentItem = properties.ListItem; 

      string empId = HttpContext.Current.Request.QueryString["EMP_ID"].ToString(); 
      foreach(SPListItem item in employeesCollection) 
      { 
       if(item["EMP_ID"].Equals(empId)){ 
        string name = item["Name"].ToString(); 
        currentItem["Name"] = name; 
       } 
      } 
     } 
     catch (Exception err) 
     { 
      properties.ErrorMessage = "ERROR: " + err.Message; 
     } 

回答

3

首先,我不認爲你將能夠從事件接收器中訪問頁面的查詢字符串參數。作爲一種解決方法,我會建議使用JavaScript填充SPListItem中的EMP_ID字段。

其次,「Created By」系統字段是否包含創建該記錄的用戶?

例如,把這個JavaScript您EditForm.aspx來填充從EMP_ID參數命名爲「的Emp ID字段」字段:

<script type="text/javascript" src="/path/to/prototype.js"></script> 
<script type="text/javascript" src="/path/to/SPUtility.js"></script> 
<script type="text/javascript"> 

function SetValueFromURL(fieldName,queryParamName) { 
    var queryParams = location.href.toQueryParams(); 
    if (queryParams != null && queryParams[queryParamName] != null) { 
     SPUtility.GetSPField(fieldName).SetValue(decodeURI(queryParams[queryParamName])); 
    } 
} 

Event.observe(window,'load',function(){ 
    try { 

     // TODO: Put your code here 
     SetValueFromURL('Emp ID Field', 'EMP_ID'); 

    } catch (ex) { 
     alert(ex.toString()); 
    } 
}); 

</script> 

這是使用SPUtility.js(全面披露,該庫保持由我)。

然後,在您的事件接收器中,您可以訪問EMP ID以查找正確的名稱。

try 
{ 
    // same code... 

    SPListItem currentItem = properties.ListItem; 

    // **CHANGED** get the current employee's ID from the current SPListItem 
    string empId = currentItem["Emp ID Field"].ToString(); 
    foreach(SPListItem item in employeesCollection) 
    { 
     if(item["EMP_ID"].Equals(empId)){ 
      string name = item["Name"].ToString(); 
      currentItem["Name"] = name; 
     } 
    } 
} 
catch (Exception err) 
{ 
    properties.ErrorMessage = "ERROR: " + err.Message; 
} 

其他有些事情,我與你的代碼注意到...

  1. 我想你可能必須要更新properties.ListItem問題。我想你可能需要更新AfterProperties而不是(take a look at this very handy reference)。
  2. 通過不遍歷列表中的每個項目,可以使查找效率更高。如果EMP_ID是自動生成的SharePoint ID,請使用SPQuery對象或SPList.GetItemById

例如:

try 
{ 
    SPSite ohportal = new SPSite("http://moss2007dev:1234"); 
    SPWeb site = ohportal.OpenWeb(); 
    SPList vitality = site.Lists[properties.ListId]; 
    SPList employees = site.Lists["Employees List"]; 
    SPListItemCollection vitalityCollection = vitality.Items; 
    SPListItemCollection employeesCollection = employees.Items; 

    SPListItem currentItem = properties.ListItem; 

    // lookup the employees name 
    string empId = currentItem["EMP_ID"].ToString(); 
    SPListItem employee = list.GetItemById(Int32.Parse(empId)); 
    properties.AfterProperties["Name"] = employee["Name"].ToString(); 
} 
catch (Exception err) 
{ 
    properties.ErrorMessage = "ERROR: " + err.Message; 
} 
+0

Hi Kit,在這種情況下,「創建者」列無效,因爲只有一個用戶創建該項目,即醫生。所以,我需要的是具有標識符的特定項目所屬,可以完成過濾。我會研究上述選項。感謝您及時的回覆。 :) – janejanejane 2010-11-05 09:11:13

+0

嗨,在上面的代碼中,我怎麼可以引用另一個列表在同一個網站,將確定我的條件爲EMP_ID? – janejanejane 2010-11-05 10:56:46

+0

簡,我認爲我的答案可能沒有包含足夠的細節(已更新,請看一下)。基本上,你會使用JavaScript來填充一個字段,以便你可以在你的事件接收器中引用它(因爲你不能訪問QueryString)。 – 2010-11-05 15:21:01

0

我認爲這是不可能的,但你應該嘗試的ItemAdding事件,同步

+0

我也叫的HttpContext的ItemAdding事件中,仍然返回null。 – janejanejane 2010-11-04 08:50:49

+0

很有意義,因爲事件接收器不會在http請求的上下文中運行 – 2010-11-04 19:14:19

相關問題