【问题标题】:Any use to grab a SPListItem by multiple means in an event receiver?在事件接收器中通过多种方式获取 SPListItem 有什么用?
【发布时间】:2013-09-13 14:03:09
【问题描述】:

我正在为大约 6 年前开发的自定义事件接收器中的代码提供支持...没有源代码,因此我们必须反映生产程序集,并且正在努力在工作之前对其进行清理。

在代码中,我遇到了这个问题,但我不知道为什么会这样做,而且我对 SharePoint 的了解不够,无法知道是否有理由必须这样做,或者如果最初的编码员是个白痴(两者都有可能......)

public override void ItemAdded(SPItemEventProperties properties)
{
    Trace.WriteLine("ItemAdded() invoked.");
    base.DisableEventFiring();
    base.ItemAdded(properties);

    try
    {
        SPContext context = SPContext.GetContext(properties.OpenWeb());
        SPUserToken userToken = context.Site.SystemAccount.UserToken;

        using (SPSite site = new SPSite(context.Site.ID, userToken))
        using (SPWeb web = site.OpenWeb(context.Web.ID))
        {
            SPListItem listItem = null;
            try
            {
                listItem = web.GetListItem(properties.ListItem.Url);
                web.AllowUnsafeUpdates = true;
            }
            catch
            {
                Trace.WriteLine("No Url properties, we must be running in CLI mode. Exiting...");
            }
            if (listItem != null)
            {
                SPList parentList = listItem.ParentList;
                listItem = parentList.GetItemById(properties.ListItemId);
            }
            ...
        }
    }
    catch (Exception ex)
    {
        Trace.WriteLine(ex.ToString());
    }
    finally
    {
        base.EnableEventFiring();
    }
}

这似乎是通过多种方式获取 SPListItem,当它在 properties 对象中传递时......网站也是如此......所以,我想我的问题是因为他们最终只是得到了无论如何,通过列表按属性列出项目,真的有任何理由通过所有其他检查/方法最终将值扔掉吗?

【问题讨论】:

    标签: c# sharepoint sharepoint-2007 wss-3.0


    【解决方案1】:

    不同之处在于它没有使用当前用户的凭据获取列表项;它正在使用系统帐户的凭据来获取它。

    系统帐户可能对当前用户没有的列表项具有权限。

    也就是说,获取列表项肯定有更简单的方法,而且没有理由像那样多次获取它,即使获取一次可能是合适的。

    【讨论】:

    • 是的,我看到它在那里做了一些模仿,但不认为所有的来回都是必要的..你能提出一个更好的方法吗?只做一次?
    • @tostringtheory 我认为这里显示的两个选项中的任何一个都没有任何问题。只需选择一个并删除另一个。
    • 好的。你说“肯定有更简单的方法来获取列表项......” - 我正在检查是否有一些东西不在上面的代码中。我想我可以只清除其中一个,但是代码中没有更好的东西吗?
    • @tostringtheory 关于唯一的另一件事是我会避免打开两个网络。只需使用 SPSecurity.RunWithElevatedPrivilages 并打开一个常规网络一次。
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 2011-03-14
    • 2012-03-17
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多