コンテンツタイプが有効になっているリスト内のSPフィールドは、期待どおりに更新されていません

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/36468

  •  09-12-2019
  •  | 
  •  

質問

私がここに行方不明のパズルの大きな部分があります。

コンテンツタイプが有効になっているリストがあります。私は、FeatureUpgradingメソッドのいくつかの選択フィールドにオプションを追加しようとしています。フィールドコレクションのフィールドは更新されていますが、リストの内容タイプのフィールドはそうではありません。

下記のコード:

eventReciever.cs

public override void FeatureUpgrading(SPFeatureReceiverProperties properties, string upgradeActionName, System.Collections.Generic.IDictionary<string, string> parameters)
{
    SPWeb web = (SPWeb)properties.Feature.Parent;

    switch ( upgradeActionName ) {
        case "AddChoice":
            AddChoice(web.Fields[new Guid(parameters["FieldID"])] as SPFieldMultiChoice, parameters["Choice"]);
            break;
    }
}

protected static void AddChoice(SPFieldMultiChoice field, string choice) {
    if ( field == null ) {
        throw new ArgumentNullException("field");
    }

    field.Choices.Add(choice);
    field.Update(true);
}
.

template.xml

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/">
    <UpgradeActions>
        <VersionRange BeginVersion="0.0.0.0" EndVersion="1.0.1.0">
            <CustomUpgradeAction Name="AddChoice">
                <Parameters>
                    <Parameter Name="FieldID">{82E08EC3-0C5C-4565-B0D1-740BDBE4FA93}</Parameter>
                    <Parameter Name="Choice">METT</Parameter>
                </Parameters>
            </CustomUpgradeAction>
            <CustomUpgradeAction Name="AddChoice">
                <Parameters>
                    <Parameter Name="FieldID">{1C2947AF-86EB-4DD0-95AF-D27FBA8EE3BC}</Parameter>
                    <Parameter Name="Choice">METT</Parameter>
                </Parameters>
            </CustomUpgradeAction>
            <CustomUpgradeAction Name="AddChoice">
                <Parameters>
                    <Parameter Name="FieldID">{EBA64EAA-000E-46EE-B1DE-C9761899A31B}</Parameter>
                    <Parameter Name="Choice">METT</Parameter>
                </Parameters>
            </CustomUpgradeAction>
        </VersionRange>
    </UpgradeActions>
</Feature>
.

あなたの時間をありがとう。

更新:

以下のDerek Gusoffのコメントに従って、AddChoiceメソッドを以下のコードに変更しました。まだ動かない。私はあなたがこれをやるべき方法についてまだ失われています。

protected static void AddChoice(SPWeb web, SPFieldMultiChoice field, string choice) {
    if ( field == null ) {
        throw new ArgumentNullException("field");
    }

    field.Choices.Add(choice);
    field.Update(true);

    SPFieldLink fieldLink = new SPFieldLink(field);

    foreach ( SPList list in web.Lists ) {
        if ( !list.ContentTypesEnabled ) continue;

        bool update = false;

        foreach ( SPContentType contentType in list.ContentTypes ) {
            if ( contentType.FieldLinks[field.Id] == null ) continue;

            update = true;

            string[] order = ( from SPFieldLink f in contentType.FieldLinks select f.Name ).ToArray();

            contentType.FieldLinks.Delete(field.Id);
            contentType.FieldLinks.Add(fieldLink);
            contentType.FieldLinks.Reorder(order);

            contentType.Update(true);
        }

        if ( update ) {
            list.Update(true);
        }
    }
}
.

役に立ちましたか?

解決 2

私はそれを考え出した。私は機能を手動でアップグレードして機能のアップグレードをトリガーする必要があります。ソリューションを自分自身でアップグレードすることはこれをしません。これを行う最もラジコンは、 http://spfeatureupgrade.codeplex.com/ です。

これを考え出したら、私の変更をリストにプッシュするために必要なのは、私のコンテンツタイプのSPContentType.Update(true)と呼ばれます。コードは次のとおりです。

eventReciever.cs

public override void FeatureUpgrading(SPFeatureReceiverProperties properties, string upgradeActionName, System.Collections.Generic.IDictionary<string, string> parameters)
{
    SPWeb web = (SPWeb)properties.Feature.Parent;

    switch ( upgradeActionName ) {
        case "PushFieldUpdatesToList":
            PushFieldUpdatesToList(web.Fields[new Guid(parameters["FieldID"])]);
            break;
    }
}

protected static void PushFieldUpdatesToList(SPField field) {
    if ( field == null ) {
        throw new ArgumentNullException("field");
    }

    field.Update(true);
}
.

template.xml

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/">
    <UpgradeActions>
        <VersionRange BeginVersion="0.0.0.0" EndVersion="1.0.1.0">
            <CustomUpgradeAction Name="PushFieldUpdatesToList">
                <Parameters>
                    <Parameter Name="FieldID">{82E08EC3-0C5C-4565-B0D1-740BDBE4FA93}</Parameter>
                </Parameters>
            </CustomUpgradeAction>
        </VersionRange>
    </UpgradeActions>
</Feature>
.

これが他の誰かを助けることを願っています。まさに最も直感的なプロセスではありません。あなたの時間のためにもう一度ありがとう。

他のヒント

編集:最後に私がそれを検証せずにあなたに記憶からの答えを与えようとしました、そしてそれは間違っていました。それについてすみません。私は再び考え抜かれた答えを発射しないでください。今回は、2つのコンテンツタイプを含むリストを作成しました。どちらも 'Region'という選択フィールドを持っていました。その後、コンソールアプリでこのコードを実行しました:

 SPList list = web.Lists.TryGetList("blah");
 if (list != null)
 {                   
     SPFieldChoice fld = list.Fields["region"] as SPFieldChoice;
     fld.Choices.Add("southwest");
     fld.Update();
 }
.

これはリスト上の両方のコンテンツタイプの選択フィールドを更新しました。私はこれがあなたがその後のものであることを願っています。機能受信機の変更なしで実行する必要があります。

また、これはサンドボックスでは機能しません。コードをステップスルーするときに機能するように見えますが、フィールドは更新されません。すべてのアカウントでは機能する必要がありますが、そうではありません。

ライセンス: CC-BY-SA帰属
所属していません sharepoint.stackexchange
scroll top