0

これはもっと簡単だと思いましたが、イベント ハンドラーでファイルの最初のチェックインかどうかを判断する方法が見つかりません。

おわかりのように、私は役割の継承を壊し、ドキュメント ライブラリ内のファイルのアクセス許可を選択的に継承していますが、ファイルの最初のチェックイン時に一度だけ実行したいと考えています。

ファイルが新しいかどうかを示すために、ItemAdded イベントで「SPListItem.Properties」にエントリを追加しようとしましたが、「SPListItem.Update()」を実行するとすぐに消えます..

ItemCheckingIn および ItemCheckedIn イベントで遊んでみましたが、成功しませんでした...

現時点で私の唯一の希望は、SPField を ContentType に追加して、新しいファイルかどうかを示すことですが、本当にそれを避けたい..

何か案は????

私を助けてください!

4

2 に答える 2

1

システム アカウントにアクセス権があるかどうかだけでなく、ファイルのチェックアウト日がファイルの作成日と同じかどうかも考慮することをお勧めします。

public bool IsFirstCheckIn(SPListItem item)
{
    // Item not null!
    if (item != null)
    {
        SPSecurity.RunWithElevatedPrivileges(delegate
        {
            // Open privileged Site
            using (SPSite pSite = new SPSite(site.ID))
            {
                // Open privileged Web
                using (SPWeb pWeb = pSite.OpenWeb(web.ID))
                {
                    // Create privileged SharePoint-Objects
                    SPList pList = GetList(pWeb, list.ID);
                    SPListItem pItem = GetListItem(pList, item.UniqueId);

                    // Check the Item
                    if (pItem == null)
                    {
                        // Can't access
                        return true;
                    }
                    else if (pItem.File != null && pItem.File.CheckedOutByUser != null)
                    {
                        // If the Item's File and checked out User is set, check if checked out date is equal creation date
                        return (pItem.File.CheckedOutDate.ToLocalTime() == pItem.File.TimeCreated.ToLocalTime());
                    }
                }
            }            
        });    
    }

    return false;
}

システム アカウントを使用することは間違いなく良い考えです。そうしないと、認証設定が問題を引き起こす可能性があります。「UTC-Time」の代わりに「現地時間」を使用してください。SharePoint は保存中にタイム ゾーンを処理しました。

SharePointはUTF-FileTimeを使用してファイルの作成時間を保存しましたが、SPWebまたはSPUserに定義されたタイムゾーンを使用して、「ローカル時間」に基づいてファイルのチェックアウト日を保存したようです。

幸いなことに、DateTime 値はそれが何であるかを認識しており、ToLocalTime() を呼び出すときに同じ「現地時間」に変換できます。不思議なことに、ToUniversalTime(); を呼び出している間はまだ File-Time になります。

于 2013-07-15T09:35:25.483 に答える
0

だから私はこれに対する解決策を得ました。ここにコードを投稿できず申し訳ありません。開発マシンでインターネットにアクセスできません。それは誰にとっても十分なはずです。

解決策: CheckingIn イベント中に、SHAREPOINT\system("SPSecurity.RunWithElevatedPrivileges()") を使用してファイルにアクセスしようとしました。最初のチェックイン中、ファイルは新しく、アップローダー以外のユーザーはアクセスできません。

したがって、SHAREPOINT\system でファイルを取得できなかった場合、それは新しいことを意味し、その Guid を EventHandlers クラスの辞書に保存します。

次に、CheckedIn イベントで、ディクショナリに現在のアイテムの Guid が含まれているかどうかを確認します。含まれている場合は最初のチェックイン、含まれていない場合は最初のチェックインではありません。

もちろん、ファイルを使い終わったら、辞書からエントリを削除します。

ご不明な点がございましたら、お気軽にお問い合わせください:)

于 2012-08-03T11:39:46.093 に答える