لا يتم تحديث حقول SPField الموجودة في القائمة التي تم تمكين أنواع المحتوى بها كما هو متوقع

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

  •  09-12-2019
  •  | 
  •  

سؤال

هناك قطعة كبيرة من اللغز أفتقدها هنا.

لدي قائمة بأنواع المحتوى الممكنة.أحاول برمجيًا إضافة خيار لبعض حقول الاختيار في طريقة ترقية الميزات.يتم تحديث الحقول الموجودة في مجموعة الحقول، ولكن الحقول الموجودة في أنواع محتوى القائمة لا يتم تحديثها.

الرمز أدناه:

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>

نأمل أن يساعد هذا شخص آخر.إنها ليست بالضبط العملية الأكثر بديهية.شكرا مرة أخرى على وقتك.

نصائح أخرى

تحرير: آخر مرة حاولت أن أعطيك إجابة من الذاكرة دون التحقق من ذلك، وكان خطأ.اسف بشأن ذلك.لن أسترد عن إجابة سيئة التفكير مرة أخرى.هذه المرة قمت بإنشاء قائمة مع نوعين من المحتوى، كان لكل منهما حقل اختيار يدعى "المنطقة".ثم في تطبيق وحدة التحكم، ركض هذا الرمز: giveacodicetagpre.

تم تحديث هذا حقل الاختيار في كلا أنواع المحتوى في القائمة.آمل أن يكون هذا ما أنت بعد.يجب أن تعمل مع عدم وجود تعديلات في جهاز استقبال ميزة.

أيضا، لاحظ أن هذا لن يعمل في Sandbox.يبدو أنه يعمل عند التنقل عبر الرمز، لكن الحقل لن يتم تحديثه.من خلال جميع الحسابات يجب أن تعمل ولكنها لا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى sharepoint.stackexchange
scroll top