如何在Sharepoint itemadded事件中检索查询字符串

时间:2010-11-04 06:13:29

标签: c# sharepoint events

请帮忙。

我在一个网站中有两个不同的列表。

在一个列表中,我在新表单中附加了一个查询字符串,表示用户的EMP_ID。在这里,我有一个隐藏字段“Name”来表示用户填写的记录。此“名称”字段是从具有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;
        }

2 个答案:

答案 0 :(得分:3)

首先,我认为您无法从事件接收器中访问页面的查询字符串参数。作为一种解决方法,我建议使用JavaScript在SPListItem中填充EMP_ID字段。

其次,“Created By”系统字段不会保留创建记录的用户吗?

例如,将此JavaScript放在EditForm.aspx上以从EMP_ID参数填充名为“Emp ID Field”的字段:

<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
  3. 例如:

    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;
    }
    

答案 1 :(得分:0)

我认为这是不可能的,但你应该尝试同步的ItemAdding事件