2

SPFileCollection.Add メソッドを使用して新しいアイテムをドキュメント ライブラリに追加する必要がありますが、このメソッドのオーバーロードが適合しないようです。

シナリオ: ファイルがドキュメント ライブラリに追加され、複数選択 (チェックボックス) のある部門選択フィールドで値が選択されている場合、itemUpdated イベントは、選択された部門の購入フォルダーに追加されたファイルへのリンクを作成することになっています。

現在何が起こっているか: コードは、ファイルをリンクとしてではなく、新しいファイルとして追加します。

私は次のことを試しました...

string departments = Convert.ToString(properties.ListItem[Constants.Departments]);
if (!string.IsNullOrEmpty(departments))
{
string[] linkTargets = departments.Split(';', '#');

string purchasingLink = string.Concat(properties.Web.Url, "/", properties.List.RootFolder.Url, "/", Constants.Purchasing, "/");

foreach (string linkTarget in linkTargets)
{
    if (!string.IsNullOrEmpty(linkTarget))
    {
        SPFolder targetFolder = properties.Web.GetFolder(purchasingLink + linkTarget);
        SPFileCollection targetLibFiles = properties.List.RootFolder.Files;
        targetLibFiles.Add()
        string fileUrl = string.Concat(purchasingLink, linkTarget, "/", properties.ListItem.File.Name);

        SPFile newFile = targetLibFiles.Add(fileUrl, properties.ListItem.File.OpenBinary());
        SPListItem newItem = newFile.Item;

        newItem[SPBuiltInFieldId.ContentType] = SPBuiltInContentTypeId.LinkToDocument;

        SPFieldUrlValue linkFieldValue = new SPFieldUrlValue();

        linkFieldValue.Url = fileUrl;

        newItem[SPBuiltInFieldId.URL] = linkFieldValue;

        newItem.Update();

          }
    }
}

更新:そこで、James Michal Lucas のコメントにリンクされているブログ投稿 をチェックしました。

メソッドで使用されるオーバーロードが存在しないため、コピーして貼り付けることができませんでしたが、Add(...) メソッドでコンテンツ タイプを提供するためのハッシュテーブルなどの興味深い点がいくつかありました。私のコードでの結果の変更:

Hashtable itemProperties = new Hashtable();
SPContentTypeId ctId = SPBuiltInContentTypeId.LinkToDocument;
itemProperties["ContentTypeId"] = ctId.ToString();

string fileUrl = string.Concat(purchasingLink, linkTarget, "/", properties.ListItem.File.Name);

SPFile newFile = targetLibFiles.Add(fileUrl, properties.ListItem.File.OpenBinary(), itemProperties);

これを実行し、新しいアイテムのコンテンツ タイプを powershell で確認すると、
PS C:\Users\xy> $file.Item.ContentType.Name
Link to a Documentが明らかになります。

ただし、元のファイルを削除しても「リンク」は無効になりません。それはまだうまくいきます。結局のところ、それはリンクではありません。

4

1 に答える 1