在 SharePoint 项目系统的扩展中保存数据

在扩展 SharePoint 项目系统时,可以保存在关闭 SharePoint 项目后继续存在的字符串数据。 该数据通常与特定项目项或项目本身关联。

如果您的数据无需保留,则可将该数据添加到实现 IAnnotatedObject 接口的 SharePoint 工具对象模型中的任何对象。 有关更多信息,请参见将自定义数据与 SharePoint 工具扩展相关联

保存与项目项关联的数据

当您的数据与特定 SharePoint 项目项关联(例如,添加到项目项的属性的值)时,可以将数据保存到此项目项的 .spdata 文件。 为此,请使用 ISharePointProjectItem 对象的 ExtensionData 属性。 添加到此属性的数据将保存在项目项的 .spdata 文件中的 ExtensionData 元素中。 有关更多信息,请参见 ExtensionData 元素

下面的代码示例演示如何使用 ExtensionData 属性保存在自定义 SharePoint 项目项类型中定义的字符串属性的值。 若要在一个更大的示例上下文中查看此示例,请参见如何:向自定义 SharePoint 项目项类型中添加属性

Private Const TestPropertyId As String = "Contoso.ExampleProperty"
Private Const PropertyDefaultValue As String = "This is an example property."

<DisplayName("Example Property")> _
<DescriptionAttribute("This is an example property for project items.")> _
<DefaultValue(PropertyDefaultValue)> _
Public Property ExampleProperty As String
    Get
        Dim propertyValue As String = Nothing

        ' Get the current property value if it already exists; otherwise, return a default value.
        If False = projectItem.ExtensionData.TryGetValue(TestPropertyId, propertyValue) Then
            propertyValue = PropertyDefaultValue
        End If
        Return propertyValue
    End Get
    Set(ByVal value As String)
        If value <> PropertyDefaultValue Then
            ' Store the property value in the ExtensionData property of the project item.
            ' Data in the ExtensionData property persists when the project is closed.
            projectItem.ExtensionData(TestPropertyId) = value
        Else
            ' Do not save the default value.
            projectItem.ExtensionData.Remove(TestPropertyId)
        End If
    End Set
End Property
private const string PropertyId = "Contoso.ExampleProperty";
private const string PropertyDefaultValue = "This is an example property.";

[DisplayName("Example Property")]
[DescriptionAttribute("This is an example property for project items.")]
[DefaultValue(PropertyDefaultValue)]
public string ExampleProperty
{
    get
    {
        string propertyValue;

        // Get the current property value if it already exists; otherwise, return a default value.
        if (!projectItem.ExtensionData.TryGetValue(PropertyId, out propertyValue))
        {
            propertyValue = PropertyDefaultValue;
        }
        return propertyValue;
    }
    set
    {
        if (value != PropertyDefaultValue)
        {
            // Store the property value in the ExtensionData property of the project item. 
            // Data in the ExtensionData property persists when the project is closed.
            projectItem.ExtensionData[PropertyId] = value;
        }
        else
        {
            // Do not save the default value.
            projectItem.ExtensionData.Remove(PropertyId);
        }
    }
}

保存与项目关联的数据

当您具有项目级数据(例如,添加到 SharePoint 项目的属性的值)时,可以将该数据保存到项目文件(.csproj 文件或 .vbproj 文件)或项目用户选项文件(.csproj.user 文件或 .vbproj.user 文件)。 选择用来保存数据的文件取决于您希望使用该数据的方式:

  • 如果您希望该数据对所有打开 SharePoint 项目的开发人员可用,请将该数据保存到项目文件。 由于总是会将此文件签入源代码管理数据库,因此此文件中的数据对签出该项目的其他开发人员可用。

  • 如果您希望数据仅对已在 Visual Studio 中打开 SharePoint 项目的当前开发人员可用,则将数据保存到项目用户选项文件中。 由于通常不会将此文件签入源代码管理数据库,因此此文件中的数据对签出该项目的其他开发人员不可用。

将数据保存到项目文件中

若要将数据保存到项目文件中,请将 ISharePointProject 对象转换为 IVsBuildPropertyStorage 对象,然后使用 IVsBuildPropertyStorage.SetPropertyValue 方法。 下面的代码示例演示如何使用此方法将项目属性的值保存到项目文件中。 若要在一个更大的示例上下文中查看此示例,请参见如何:向 SharePoint 项目中添加属性

Private sharePointProject As ISharePointProject
Private projectStorage As IVsBuildPropertyStorage
Private Const ProjectFilePropertyId As String = "ContosoCustomProjectFileProperty"
Private Const ProjectFilePropertyDefaultValue As String = "Default"

Public Sub New(ByVal myProject As ISharePointProject)
    sharePointProject = myProject
    projectStorage = sharePointProject.ProjectService.Convert(Of ISharePointProject, IVsBuildPropertyStorage)(sharePointProject)
End Sub

<DisplayName("Custom Project File Property")> _
<DescriptionAttribute("This property is saved to the .csproj/.vbproj file.")> _
<DefaultValue(ProjectFilePropertyDefaultValue)> _
Public Property CustomProjectFileProperty As String
    Get
        Dim propertyValue As String = String.Empty
        Dim hr As Integer = projectStorage.GetPropertyValue(ProjectFilePropertyId, String.Empty, _
            CUInt(_PersistStorageType.PST_PROJECT_FILE), propertyValue)

        ' Try to get the current value from the project file; if it does not yet exist, return a default value.
        If Not ErrorHandler.Succeeded(hr) Or String.IsNullOrEmpty(propertyValue) Then
            propertyValue = ProjectFilePropertyDefaultValue
        End If
        Return propertyValue
    End Get
    Set(ByVal value As String)
        ' Do not save the default value.
        If value <> ProjectFilePropertyDefaultValue Then
            projectStorage.SetPropertyValue(ProjectFilePropertyId, String.Empty, _
                CUInt(_PersistStorageType.PST_PROJECT_FILE), value)
        End If
    End Set
End Property
private ISharePointProject sharePointProject;
private IVsBuildPropertyStorage projectStorage;
private const string ProjectFilePropertyId = "ContosoCustomProjectFileProperty";
private const string ProjectFilePropertyDefaultValue = "Default";

public CustomProjectProperties(ISharePointProject myProject)
{
    sharePointProject = myProject;
    projectStorage = sharePointProject.ProjectService.Convert<ISharePointProject, IVsBuildPropertyStorage>(sharePointProject);
}

[DisplayName("Custom Project File Property")]
[DescriptionAttribute("This property is saved to the .csproj/.vbproj file.")]
[DefaultValue(ProjectFilePropertyDefaultValue)]
public string CustomProjectFileProperty
{
    get
    {
        string propertyValue;
        int hr = projectStorage.GetPropertyValue(ProjectFilePropertyId, string.Empty, 
            (uint)_PersistStorageType.PST_PROJECT_FILE, out propertyValue);

        // Try to get the current value from the project file; if it does not yet exist, return a default value.
        if (!ErrorHandler.Succeeded(hr) || String.IsNullOrEmpty(propertyValue))
        {
            propertyValue = ProjectFilePropertyDefaultValue;
        }

        return propertyValue;
    }

    set
    {
        // Do not save the default value.
        if (value != ProjectFilePropertyDefaultValue)
        {
            projectStorage.SetPropertyValue(ProjectFilePropertyId, string.Empty, 
                (uint)_PersistStorageType.PST_PROJECT_FILE, value);
        }
    }
}

有关将 ISharePointProject 对象转换为 Visual Studio 自动化对象模型或集成对象模型中的其他类型的更多信息,请参见在 SharePoint 项目系统类型和其他 Visual Studio 项目类型之间进行转换

将数据保存到项目用户选项文件中

若要将数据保存到项目用户选项文件中,请使用 ISharePointProject 对象的 ProjectUserFileData 属性。 下面的代码示例演示如何使用此属性将项目属性的值保存到项目用户选项文件中。 若要在一个更大的示例上下文中查看此示例,请参见如何:向 SharePoint 项目中添加属性

Private Const UserFilePropertyId As String = "ContosoCustomUserFileProperty"
Private Const UserFilePropertyDefaultValue As String = "Default"

<DisplayName("Custom Project User File Property")> _
<DescriptionAttribute("This property is saved to the .user file.")> _
<DefaultValue(UserFilePropertyDefaultValue)> _
Public Property CustomUserFileProperty As String
    Get
        Dim propertyValue As String = String.Empty
        ' Try to get the current value from the .user file; if it does not yet exist, return a default value.
        If Not sharePointProject.ProjectUserFileData.TryGetValue(UserFilePropertyId, propertyValue) Then
            propertyValue = UserFilePropertyDefaultValue
        End If
        Return propertyValue
    End Get
    Set(ByVal value As String)
        ' Do not save the default value.
        If value <> UserFilePropertyDefaultValue Then
            sharePointProject.ProjectUserFileData(UserFilePropertyId) = value
        End If
    End Set
End Property
private const string UserFilePropertyId = "ContosoCustomUserFileProperty";
private const string UserFilePropertyDefaultValue = "Default";

[DisplayName("Custom Project User File Property")]
[DescriptionAttribute("This property is saved to the .user file.")]
[DefaultValue(UserFilePropertyDefaultValue)]
public string CustomUserFileProperty
{
    get
    {
        string propertyValue = string.Empty;

        // Try to get the current value from the .user file; if it does not yet exist, return a default value.
        if (!sharePointProject.ProjectUserFileData.TryGetValue(UserFilePropertyId, out propertyValue))
        {
            propertyValue = UserFilePropertyDefaultValue; 
        }

        return propertyValue; 
    }

    set
    {
        // Do not save the default value.
        if (value != UserFilePropertyDefaultValue)
        {
            sharePointProject.ProjectUserFileData[UserFilePropertyId] = value;
        }
    }
}                

请参见

概念

扩展 SharePoint 项目系统

其他资源

将自定义数据与 SharePoint 工具扩展相关联

在 SharePoint 项目系统类型和其他 Visual Studio 项目类型之间进行转换