Как получить строку запроса в событии Sharemad itemadded - PullRequest
2 голосов
/ 04 ноября 2010

Пожалуйста, помогите.

У меня есть два разных списка на одном сайте.

В одном списке я добавил строку запроса к новой форме, которая будет представлять 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;
        }

Ответы [ 2 ]

3 голосов
/ 04 ноября 2010

Во-первых, я не думаю, что вы сможете получить доступ к параметрам строки запроса страницы из приемника событий. В качестве обходного пути я бы предложил заполнить поле EMP_ID в вашем SPListItem с помощью JavaScript.

Во-вторых, не будет ли системное поле «Создано» содержать пользователя, создавшего запись?

Например, поместив этот JavaScript в свой EditForm.aspx, чтобы заполнить поле с именем 'Emp ID Field' из параметра 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 вместо этого ( взгляните на этот очень удобный справочник ).
  2. Вы можете повысить эффективность поиска, не перебирая все элементы в списке. Используйте объект SPQuery или SPList.GetItemById , если EMP_ID является автоматически сгенерированным идентификатором SharePoint.

Например:

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 голосов
/ 04 ноября 2010

Я думаю, что это невозможно, но вы должны попробовать событие ItemAdding, которое синхронизирует

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...