MS CRM 2011 如何获得Option Set的Label与Value

简介:

CRM中有一种Field的类型是Option Set。每一个option都是由一对 label + value组成的。比如我下面图中的Option Set,它的第一个option的Label是Logistic – Incorrect item,而它的value为267060000。

image

 

那么CRM SDK为我们提供了哪写方法可以获得一个Option Set 的Label和Value值呢?我在案例(incident)中创建了一个custom field aw_complaintcause,它是Option Set类型,而它所使用的Option Set即为上面图中创造的Case Option Set。

image

 

下面我分别演示一下在CRM的前端与后端如何获得Option Set 的Label 与 Value。

 

(一)前端

如果是使用JScript获得某个Option Set field的Label 或者 Value,比如在Form的OnLoad事件处理器中,可以用

 

获得 Label:

Xrm.Page.getAttribute(fieldname).getText();

 

获得 Value:

Xrm.Page.getAttribute(fieldname).getValue();

 

如果Option Set为Unassigned Value,上面方法获得Label为空字符””,Value值为null。

 

我们也可以遍历一个Option Set 的所有options:

复制代码
var objControl = Xrm.Page.getControl(fieldname); 
var objOptions = objControl.getAttribute().getOptions();

for (var i = 0; i < objOptions.length; i++) { 
    alert(objOptions[i].text); 
    alert(objOptions[i].value); 
} 
复制代码

 

 

(二) 后端

运行在服务器上的代码(C#或者VB)该如何获得某个Option Set的Label或Value呢?

以插件(plugin)中的代码为例,获得Value很简单,可以使用

int optionValue = ((OptionSetValue)entity[fieldname]).Value;

代码的片断如下所示:

复制代码
if (context.MessageName == "Update") 
{ 
    Entity entity = (Entity)context.InputParameters["Target"]; 
    if (entity.Contains(fieldname) && entity[fieldname] != null) 
    { 
        int optionValue = ((OptionSetValue)entity[fieldname]).Value; 
    }                                        
}
复制代码

如果Option Set为Unassigned Value,则entity[fieldname] 为 null。

 

要获得Label就不象用JScript那样简单了,我们首先要知道当前option的value值,然后发送一个RetrieveAttributeRequest,在RetrieveAttributeResponse中获得AttributeMetadata,然后遍历Option Set的每一个option,当某个option的Value值与我们的value相等时,返回该option的Label。可以使用下面的代码来获得Label

复制代码
private string GetOptionLabel(IOrganizationService service, ITracingService tracingService, string entityname, string attributename, int value) 
{

    RetrieveAttributeRequest retrieveAttributeRequest = 
        new RetrieveAttributeRequest 
        { 
            EntityLogicalName = entityname, 
            LogicalName = attributename 
        };

    // Execute the request. 
    RetrieveAttributeResponse retrieveAttributeResponse = (RetrieveAttributeResponse)service.Execute(retrieveAttributeRequest); 
    tracingService.Trace("Debug: Entity {0} Attribute {1} is retrieved", entityname, attributename);

    OptionMetadataCollection options = ((PicklistAttributeMetadata)retrieveAttributeResponse.AttributeMetadata).OptionSet.Options; 

    OptionMetadata option = options.Where(x => x.Value == value).FirstOrDefault(); 
    tracingService.Trace("Debug: Option of value {0} is retrieved", value);

    if (option != null) 
    { 
        tracingService.Trace("Debug: option != null"); 
        return option.Label.UserLocalizedLabel.Label; 
    } 
    else 
    { 
        return ""; 
    } 
} 
复制代码

上面的代码返回的是option.Label.UserLocalizedLabel.Label,也就是用户当前使用语言的Label(我在前面的博客中介绍过如何获得当前用户使用的界面语言),如果你想获得其他语言的Label,也可以使用下面的方法:

复制代码
private string GetOptionLabel(IOrganizationService service, ITracingService tracingService, string entityname, string attributename, int value, int languagecode) 
{

    RetrieveAttributeRequest retrieveAttributeRequest = 
        new RetrieveAttributeRequest 
        { 
            EntityLogicalName = entityname, 
            LogicalName = attributename 
        };

    // Execute the request. 
    RetrieveAttributeResponse retrieveAttributeResponse = (RetrieveAttributeResponse)service.Execute(retrieveAttributeRequest); 
    tracingService.Trace("Debug: Entity {0} Attribute {1} is retrieved", entityname, attributename);

    OptionMetadataCollection options = ((PicklistAttributeMetadata)retrieveAttributeResponse.AttributeMetadata).OptionSet.Options; 
    OptionMetadata option = options.Where(x => x.Value == value).FirstOrDefault(); 
    tracingService.Trace("Debug: Option of value {0} is retrieved", value);

    if (option != null) 
    { 
        tracingService.Trace("Debug: option != null");

        var label = option.Label.LocalizedLabels.Where(x => x.LanguageCode == languagecode).FirstOrDefault(); 
        tracingService.Trace("Debug: Label of language {0} is retrieved", languagecode);

        if (label != null) 
        { 
            tracingService.Trace("Debug: label != null"); 
            return label.Label; 
        } 
    }

    return ""; 
} 
复制代码

这种方法需要对option.Label.LocalizedLabels进行遍历,获得某种语言的Label。

 

 

总结:在前端利用JScript获得某Option Set field的Label或Value很简单,只需要分别使用Xrm.Page.getAttribute(fieldname).getText()和Xrm.Page.getAttribute(fieldname).getValue()。在后端获得Value很容易,因为value值已经包含在OptionSetValue中了,但要获得Label,需要先获得该field的AttributeMetadata,然后对每个option遍历,找到value值相同的option,再返回该option的label。














本文转自JF Zhu博客园博客,原文链接:  http://www.cnblogs.com/jfzhu/archive/2012/12/11/2813712.html  ,如需转载请自行联系原作者





相关文章
成功解决A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,co
成功解决A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,co
|
3月前
|
Java 应用服务中间件 nginx
【Azure 环境】Azure应用程序网关设置set_Cookie=key=value; SameSite=Strict; HTTPOnly,AzureAD登录使用cookie时使用不了的案例记录
【Azure 环境】Azure应用程序网关设置set_Cookie=key=value; SameSite=Strict; HTTPOnly,AzureAD登录使用cookie时使用不了的案例记录
|
4月前
|
数据处理 Python
【Python】已解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFram
【Python】已解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFram
529 1
content‘ is declared but its value is never read.富文本编辑器中这里必须的script中添加setup,引入到set当中时,带title的富文本写法
content‘ is declared but its value is never read.富文本编辑器中这里必须的script中添加setup,引入到set当中时,带title的富文本写法
|
5月前
|
缓存 NoSQL 关系型数据库
Redis第二课,1.set key value(设置对应的key和value)2.get key(得到value值)Redis全局命令(支持很多的数据结构)3.keys(用来查询当前
Redis第二课,1.set key value(设置对应的key和value)2.get key(得到value值)Redis全局命令(支持很多的数据结构)3.keys(用来查询当前
|
6月前
What value should kernel parameter AIO-MAX-NR be set to ?
What value should kernel parameter AIO-MAX-NR be set to ?
60 0
|
JavaScript API
【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined
【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined
286 0
成功解决pandas\core\indexing.py:179: SettingWithCopyWarning: A value is trying to be set on a copy of a
成功解决pandas\core\indexing.py:179: SettingWithCopyWarning: A value is trying to be set on a copy of a
|
消息中间件 Kafka
Cannot set the value of read-only property ‘additionalSourceDirs‘ for task ‘:jacocoRootReport‘ of
这个问题是gradle的build版本问题,我是在build kafka的老版本时报的错,这个问题我查了一遍网上的内容,发现很多博客忽略了IDEA settings关于gradle的build的一个配置。
489 0
Cannot set the value of read-only property ‘additionalSourceDirs‘ for task ‘:jacocoRootReport‘ of
debian samba出错:set_variable_helper(yes ): value is not boolean!
debian samba出错:set_variable_helper(yes ): value is not boolean!
187 0