Dynamics CRM 2011 Portal Development – CrmMetadataDataSource

Dynamics CRM 2011 Portal Development

CrmMetadataDataSource data source control connects to Dynamics CRM and retrieve  Metadata and make it available for other controls to bind to, without requiring code. It only supports retrieving data.

It can retrieve metadata for all entities (EntityMetadata[]) filtered by EntityFilters enum value set through MetadataFlags, attributes metadata for one single entity (AttributeMetadata[]) filter by EntityFilters enum value set through EntityFlags, and attribute metadata of type PicklistAttributeMetadata/StatusAttributeMetadata/StateAttributeMetadata  for one single entity (IEnumerable <new { sting OptionLabel, int OptionValue}>) ordered by value specified in SortExpression.

SelectParameters is ignored while retrieve metadata from Dynamics CRM.

Retrieve metadata for all entities

To retrieve metadata for all entities, leave both EntityName and AttributeName empty, and optionally specify MetadataFlags to limit the amount of information returned. MetadataFlags takes a value of EntityFilters type.

[Flags]
 public enum EntityFilters
 {
 All = 15,
 Attributes = 2,
 Default = 1,
 Entity = 1,
 Privileges = 4,
 Relationships = 8
 }

Example:

<crm:CrmMetadataDataSource ID="CrmMetadataDataSource1" runat="server" MetadataFlags="Attributes">
</crm:CrmMetadataDataSource>
<asp:GridView ID="GridView1" runat="server" DataSourceID="CrmMetadataDataSource1">
<Columns>
 <asp:BoundField DataField="DisplayName.UserLocalizedLabel.Label" HeaderText="Display Name" />
 <asp:TemplateField HeaderText="First Attribute">
 <ItemTemplate>
 <asp:Literal runat="server" Text='<%# Eval("Attributes[0].DisplayName.UserLocalizedLabel.Label") %>' />
 </ItemTemplate>
 </asp:TemplateField>
 <asp:TemplateField HeaderText="Second Attribute">
 <ItemTemplate>
 <asp:Literal runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Attributes[1].DisplayName.UserLocalizedLabel.Label") %>' />
 </ItemTemplate>
 </asp:TemplateField>
 <asp:TemplateField HeaderText="Third Attribute">
 <ItemTemplate>
 <asp:Literal runat="server" Text='<%# ((EntityMetadata)Container.DataItem).Attributes[2].DisplayName.UserLocalizedLabel == null ? string.Empty : ((EntityMetadata)Container.DataItem).Attributes[2].DisplayName.UserLocalizedLabel.Label.ToLower() %>' />
 </ItemTemplate>
 </asp:TemplateField>
 </Columns>
 </asp:GridView>

Result:

Tips on Data-Binding Expressions

1.

<%# Eval("expression") %>

is a short cut for

<%# DataBinder.Eval(Container.DataItem, "expression") %>

2. Container.DataItem can be used within <%# and %> delimiters to refer to  the current data item of the naming container.

3. Any publicly scoped code within the <%# and %>delimiters to execute that code and return a value during page processing.

4. For the cast ((EntityMetadata)Container.DataItem) in the example to work, register Microsoft.Xrm.Sdk.Metadata namespace in web.config

<system.web>
    <pages viewStateEncryptionMode="Always" validateRequest="true">
        <namespaces>
            <add namespace="Microsoft.Xrm.Sdk.Metadata"/>
        </namespaces>
    </pages>
</system.web>

More information regarding to Data-Binding Expressions can be found Data-Binding Expressions Overview and DataBinder.Eval Method

Notes:

At the moment there is a bug in Microsoft.Xrm.Client.Messages.OrganizationServiceContextExtensions.RetrieveAllEntities(this OrganizationServiceContext service, EntityFilters entityFilters = 1, bool retrieveAsIfPublished = false) method. Parameter with name “MetadataId” should not be added to the organization request, because this cause an exception with message “Unrecognized request parameter: MetadataId”.

Retrieve metadata for one single entity

To retrieve metadata for one single entity, leave AttributeName empty, specify EntityName and optionally specify EntityFlags  to limit the amount of information returned. EntityFlags  takes a value of EntityFilters type.

Example


<crm:CrmMetadataDataSource ID="CrmMetadataDataSource2" runat="server" EntityName="account" EntityFlags="All">
 </crm:CrmMetadataDataSource>
 <asp:GridView ID="GridView2" runat="server" DataSourceID="CrmMetadataDataSource2">
 <Columns>
 <asp:BoundField DataField="DisplayName.UserLocalizedLabel.Label" HeaderText="Display Name" />
 </Columns>
 </asp:GridView>

Result

Retrieve metadata for one attribute from specified entity

To retrieve metadata for one attribute from specified entity, specify AttributeName and EntityName and optionally specify SortExpression to control the order (Value/OptionValue, Label/OptionLabel, State, DefaultStatus can be used to sort).

This is limited to attributes of type type PicklistAttributeMetadata, StatusAttributeMetadata or StateAttributeMetadata only. The return value will be of type (IEnumerable <new { sting OptionLabel, int OptionValue}>).

Example:


<crm:CrmMetadataDataSource ID="CrmMetadataDataSource3" runat="server" EntityName="account" AttributeName="industrycode" SortExpression="Label DESC">
 </crm:CrmMetadataDataSource>
 <asp:GridView ID="GridView3" runat="server" DataSourceID="CrmMetadataDataSource3">
 </asp:GridView>


Result:

More Information can be found Use CrmMetadataDataSource Control

Advertisements

One comment on “Dynamics CRM 2011 Portal Development – CrmMetadataDataSource

  1. Pingback: Dynamics CRM 2011 Portal Development | Zhongchen Zhou's Blog

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s