2016-09-22 5 views
1

В SharePoint Online у ​​меня возникают проблемы с установкой значения столбца по умолчанию для управляемого метаданных с использованием CSOM (C#). Для краткости я не включил обработку исключений в свой код. Вот что у меня есть:SharePoint Online CSOM Site Column Значение по умолчанию

// Code snippet for what I'm trying to achieve 
using (ClientContext ctx = NewCtx(SiteInfo.Url)) // NewCtx is just a static member I use to return a ClientContext object 
{ 
    Field taxColumn = (Field)ctx.Web.Fields.GetByTitle("myMMColumnName"); 
    ctx.Load(taxColumn); 
    ctx.ExecuteQuery(); 
    TaxonomyFieldValue termField = new TaxonomyFieldValue(); 
    termField.Label = "My MM Term"; 
    termField.TermGuid = "b269aef7-6f47-4b02-bf80-7edfb7166a30"; 
    termField.WssId = -1; 
    taxColumn.DefaultValue = value; 
    // Place holder for added code (see below) 
    taxColumn.Update(); 
    ctx.Load(taxColumn); 
    ctx.ExecuteQuery(); 
} 

Значение отображается в пользовательском интерфейсе в разделе Столбцы сайта, но не связанный элемент не создается в TaxonomyHiddenList, что имеет смысл, потому что установка подстановок WssId на «-1» не решает и поэтому значение по умолчанию не имеет поиска и выглядит пустым в столбце списка и библиотеки.

Самое близкое разрешение, которое я нашел, - статья (хотя и не связанная с CSOM и связанная ниже) предложила создать элемент списка «фиктивный» (против списка, который потреблял столбец ММ). Это вызовет создание элемента в журнале TaxonomyHiddenList, но в статье предлагается не совершать создание «фиктивного» элемента. Я тоже пробовал это, но, похоже, не имеет никакого эффекта. Это код, я добавил к держателю места, указанного в предыдущем блоке кода:

List myList = ctx.Web.Lists.GetByTitle("My List"); 
ctx.Load(myList); 
ctx.ExecuteQuery(); 
TaxonomyField taxField = ctx.CastTo<TaxonomyField>(myList.Fields.GetByTitle("myMMColumnName")); 
ListItemCreationInformation newItemInfo = new ListItemCreationInformation(); 
ListItem newItem = myList.AddItem(newItemInfo); 
newItem["myMMColumnName"] = termField; 
taxField.SetFieldValueByValue(newItem, termField); 

В статье использует метод .SetFieldValue, который не доступен в CSOM так что, возможно, хорошо предположить, что неправильно .SetFieldValueByValue является сопоставимыми.

Спасибо за чтение!

Ссылки: Статья - http://sharepointificate.blogspot.com/2014/04/setting-managed-metadata-column-default.html

ответ

1

SetFieldValue Method принадлежит TaxonomyField класса, это означает, что строка:

Field taxColumn = (Field)ctx.Web.Fields.GetByTitle(taxFieldTitle); 

потребности быть заменены:

var taxColumn = ctx.CastTo<TaxonomyField>(ctx.Web.Fields.GetByTitle(taxFieldTitle)); 

или

TaxonomyField taxColumn = ctx.CastTo<TaxonomyField>(ctx.Web.Fields.GetByTitle(taxFieldTitle)); 

После TaxonomyField инициализации, значение по умолчанию может быть установлен, как показано ниже:

//get taxonomy field 
var taxColumn = ctx.CastTo<TaxonomyField>(ctx.Web.Fields.GetByTitle(taxFieldTitle)); 
ctx.Load(taxColumn); 
ctx.ExecuteQuery(); 
//initialize taxonomy field value 
var defaultValue = new TaxonomyFieldValue(); 
defaultValue.WssId = -1; 
defaultValue.Label = termLabel; 
defaultValue.TermGuid = termId.ToString(); 
//retrieve validated taxonomy field value 
var validatedValue = taxColumn.GetValidatedString(defaultValue); 
ctx.ExecuteQuery(); 
//set default value for a taxonomy field 
taxColumn.DefaultValue = validatedValue.Value; 
taxColumn.Update(); 
ctx.ExecuteQuery(); 

Примечание: TaxonomyField.GetValidatedString method используется для проверки значения поля таксономии, которая в свою очередь, включает в себя решении WssId значения

Update

Использование Field.UpdateAndPushChanges method для распространения changesto все списки, которые используют поле

Итак, замените:

taxColumn.Update(); 
ctx.ExecuteQuery(); 

с:

taxColumn.UpdateAndPushChanges(true); 
ctx.ExecuteQuery(); 
+1

Привет Вадим. Это отличный ответ, и спасибо за то, что вы также объяснили, чего мне не хватает. Теперь я могу увидеть связанный элемент в TaxonomyHiddenList, и столбцы сайта выглядят отлично, однако, когда я создаю новый элемент в списке, который наследует столбец сайта, значение по умолчанию остается пустым. Нужно ли мне это реализовать против списков/библиотек? – feganmeister

+0

Возможно, вам нужно заменить метод 'Update' на' UpdateAndPushChanges'. Для получения более подробной информации следуйте обновленному ответу (раздел «Обновление») –

+1

Фантастический, все работает в надежде! Спасибо Вадим = D – feganmeister