2

SharePoint プロジェクトに追加するカスタム アイテム テンプレートがあります。プロジェクトに他の機能が既に含まれている場合でも、自分のモジュールが自分の機能にのみ関連付けられていることを確認する必要があります。

.feature ファイル内の要素のID を置き換えるのは、メソッド内のprojectItemReferenceを変更するだけで簡単です。replacementsDictionaryRunStarted

たとえば、次のSampleModule_WebParts.featureファイルがあります。

<?xml version="1.0" encoding="utf-8"?>
<feature xmlns:dm0="http://schemas.microsoft.com/VisualStudio/2008/DslTools/Core" dslVersion="1.0.0.0" Id="$SampleFeatureID$" activateOnDefault="false" description="Sample Web Part" featureId="$SampleFeatureID$" scope="Site" solutionId="00000000-0000-0000-0000-000000000000" title="Contoso Intranet Sample Module Web Parts" version="" deploymentPath="$SharePoint.Project.FileNameWithoutExtension$_$SharePoint.Feature.FileNameWithoutExtension$" xmlns="http://schemas.microsoft.com/VisualStudio/2008/SharePointTools/FeatureModel">
  <projectItems>
    <projectItemReference itemId="$SampleModuleID$" />
  </projectItems>
</feature>

メソッド内のを置き換え$SampleModuleID$$SampleFeatureID$変更するのは簡単です。しかし、生成されたファイル スニペットを変更するにはどうすればよいでしょうか。replacementsDictionaryIWizard.RunStarted.csproj

<None Include="Features\SampleModule_WebParts\SampleModule_WebParts.feature">
  <FeatureId>{78185D58-6398-4ED2-B0D0-3DC20946FF8F}</FeatureId>
</None>
<Compile Include="SPItems\SampleModule\SampleWebPart\SampleWebPart.cs" />
<Compile Include="SPItems\SampleModule\SampleWebPart\SampleWebPartUserControl.ascx.cs">
  <DependentUpon>SampleWebPartUserControl.ascx</DependentUpon>
  <SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="SPItems\SampleModule\SampleWebPart\SampleWebPartUserControl.ascx.designer.cs">
  <DependentUpon>SampleWebPartUserControl.ascx.cs</DependentUpon>
</Compile>
<None Include="SPItems\SampleModule\SampleWebPart\SampleWebPart.webpart" />
<None Include="SPItems\SampleModule\SampleWebPart\SharePointProjectItem.spdata">
  <SharePointProjectItemId>{D982D304-E7FB-4E8C-899B-7D4096A55892}</SharePointProjectItemId>
</None>

この場合、andアイテムのFeatureIdandSharePointProjectItemIdプロパティを設定する必要があります。何もしなければ、Visual Studio はこれらの GUID を自動生成しますが、. その結果、ファイル内の参照が破損し、モジュールが間違った機能に関連付けられる可能性があります。.feature.spdatareplacementsDictionary.feature

これらのカスタム プロパティを設定して.csproj、ユーザーがファイルを保存したときに保持されるようにするにはどうすればよいですか? IWizard.ProjectItemFinishedGenerating実装する正しい方法のように思われ、ProjectItemパラメータを調べてファイルがいつ.spdata生成.featureされたかを把握できますが、プロパティを設定するにはどうすればよいですか?FeatureIdSharePointProjectItemId

4

2 に答える 2

1

Project解決策は、参照をISharePointProjectと呼び出し に変換することでしたISharepointProject.Synchronize()。その後、SharePointプロジェクトのオブジェクトモデルをトラバースできました。

var sp = project.DTE as Microsoft.VisualStudio.OLE.Interop.IServiceProvider;
var projectService = new ServiceProvider(sp).GetService(typeof(ISharePointProjectService)) as ISharePointProjectService;
var sharepointProject = projectService.Convert<Project, ISharePointProject>(project);
sharepointProject.Synchronize();

ProjectItemsおよびプロパティによって返されるコレクションから自分のモジュールと自分の機能を見つけたら、モジュールを機能にFeatures関連付けるだけで済みます。

sampleFeature.ProjectItems.Add(sampleModule);

プログラムで参照を修正できるため、古いモジュールGUIDをファイルに残し、コレクション.featureを変更して無効な関連付けをクリーンアップできます。sampleFeature.Model.ProjectItems

var invalidSampleModuleAssociation = (from projectItem in sampleFeature.Model.ProjectItems
                                      where projectItem.ItemId == originalSampleModuleID
                                      select projectItem).First();
sampleFeature.Model.ProjectItems.Remove(invalidSampleModuleAssociation);

最後に、Visual Studioは新しいモジュールを適切なスコープを持つ最初の機能に自動的に関連付けるため、プロジェクトに含まれる可能性のある他の機能からモジュールを削除する必要があります。

var unneededAssociations = (from otherFeature in sharepointProject.Features
                            where otherFeature.Name != sampleFeature.Name
                            from projectItem in otherFeature.ProjectItems
                            where projectItem.Name == sampleModule.Name
                            select new
                            {
                                Feature = otherFeature,
                                ModuleToRemove = projectItem
                            }).ToArray();
foreach (var moduleAssociation in unneededAssociations)
{
    moduleAssociation.Feature.ProjectItems.Remove(moduleAssociation.ModuleToRemove);
}
于 2013-01-18T06:46:52.980 に答える
0

私の知る限り、.csprojを含む任意のファイル(ファイル名とコンテンツの両方)でも置換を行うことができます

replacementDictionary に置き換えたい Guid がある場合は、.vstemplate をチェックして、ファイルの置き換えが正しいことを確認します。

<Project
    File="MyProject.proj"
    TargetFileName="$safeprojectname$.csproj"
    ReplaceParameters="true">
</Project>

.csproj を適切に編集して、Guid を置き換えます。

<None Include="Features\SampleModule_WebParts\SampleModule_WebParts.feature">
  <FeatureId>{$SampleFeatureID$}</FeatureId>
</None>
<Compile Include="SPItems\SampleModule\SampleWebPart\SampleWebPart.cs" />
<Compile Include="SPItems\SampleModule\SampleWebPart\SampleWebPartUserControl.ascx.cs">
  <DependentUpon>SampleWebPartUserControl.ascx</DependentUpon>
  <SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="SPItems\SampleModule\SampleWebPart\SampleWebPartUserControl.ascx.designer.cs">
  <DependentUpon>SampleWebPartUserControl.ascx.cs</DependentUpon>
</Compile>
<None Include="SPItems\SampleModule\SampleWebPart\SampleWebPart.webpart" />
<None Include="SPItems\SampleModule\SampleWebPart\SharePointProjectItem.spdata">
  <SharePointProjectItemId>{$SampleModuleID$}</SharePointProjectItemId>
</None>

重要!IDictionary では大文字と小文字が区別されるため、replacementDictionary !!

于 2013-01-14T22:23:52.913 に答える