[英]Error creating an Entity in CRM 2011 - CRM doesn't like OptionSetValue
[英]Dynamics CRM 2011 OptionSetValue in different languages
有人可以幫助我弄清楚如何使用CRM 2011 SDK檢索一個選項集標簽的不同語言嗎?
我的任務如下:例如,我與德語聯系,那么我的sdk應該帶回該語言的optionsset值。 如果我與某個英國國家/地區聯系過,SDK應該將我帶回英語標簽,依此類推。
獲取值沒問題:
int optSetValue = ((OptionSetValue)entity["optionsetFieldName"]).value
但是如何獲得正確語言的標簽?
您需要執行RetrieveAttributeRequest
以獲得EnumAttributeMetadata
,然后根據語言代碼查找正確的值:
string languageCode = germanLanguageCode; // Set
int optSetValue = 0; // Set
RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest
{
EntityLogicalName = entityLogicalName,
LogicalName = attributeName,
RetrieveAsIfPublished = true
};
var response = (RetrieveAttributeResponse)service.Execute(attributeRequest);
var optionList = ((EnumAttributeMetadata)response.AttributeMetadata).OptionSet.Options;
return optionList.GetFirst(o => o.Value == optSetValue).Label.LocalizedLabels.First(l => l.LanguageCode == languageCode).Label;
或者,如果您的服務以德語用戶身份運行,則可以通過return optionList.GetFirst(o => o.Value == optSetValue).Label.UserLocalizedLabel.Label;
訪問德語文本return optionList.GetFirst(o => o.Value == optSetValue).Label.UserLocalizedLabel.Label;
我傾向於緩存元數據,而不是經常訪問CRM服務器以獲取文本信息。 但是話又說回來,我在一家只有英文的組織中,不必擔心人們使用的是什么語言...
GetFirst()
只是一個標准的Linq方法。 只要您在using語句中添加了System.Linq命名空間,任何IEnumerable都將擁有它。
德語為1031 。 盡管更正確的方法是查找用戶的UsersSetting.UILanguageId。 我相信其中應該包含正確的代碼,盡管我尚未對其進行測試...
要檢索所選值的用戶本地化選項標簽,請嘗試
string myoption;
if (!entity.FormattedValues.TryGetValue("optionsetFieldName", out myoption))
{
myoption = "Not found";
}
也可以使用LINQ查詢IList<KeyValuePair<string,string>>
FormattedValues 。
string optionlabel =entity.FormattedValues["optionsetFieldName"];
適用於我的代碼:
public static dynamic GetOptionSet(string entityName, string fieldName, int langId, OrganizationServiceProxy proxy)
{
RetrieveEntityRequest retrieveDetails = new RetrieveEntityRequest();
retrieveDetails.EntityFilters = EntityFilters.All;
retrieveDetails.LogicalName = entityName;
RetrieveEntityResponse retrieveEntityResponseObj = (RetrieveEntityResponse)proxy.Execute(retrieveDetails);
EntityMetadata metadata = retrieveEntityResponseObj.EntityMetadata;
PicklistAttributeMetadata picklistMetadata = metadata.Attributes.FirstOrDefault(attribute => String.Equals(attribute.LogicalName, fieldName, StringComparison.OrdinalIgnoreCase)) as PicklistAttributeMetadata;
OptionSetMetadata options = picklistMetadata.OptionSet;
var optionlist = (from o in options.Options
select new { Value = o.Value, Text = o.Label.LocalizedLabels.First(l => l.LanguageCode == langId).Label }).ToList();
return optionlist;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.