我有一个应用程序实体表单,其中包含 3 个多选选项集,这些选项集根据所选值确定表单的其余部分将出现哪些问题。我需要这个出现在我的门户上,或者一个可行的替代方案。
多选选项集不会在门户中呈现
我有一个应用程序实体表单,其中包含 3 个多选选项集,这些选项集根据所选值确定表单的其余部分将出现哪些问题。我需要这个出现在我的门户上,或者一个可行的替代方案。
多选选项集不会在门户中呈现
Dynamics V9.0 引入了多选选项集,但这种新的字段类型不支持在门户中呈现(..yet)。
有一个有据可查的解决方法(不使用 OOB 多选选项集)方法来创建在门户中呈现为多选选项集的内容: https ://nishantrana.me/2017/03/06/configuring-multiple-choice-field- for-web-form-in-portal-dynamics-365/
TL:DR 是为实体上的每个选项创建一个布尔(两个选项)字段,并使用表单元数据创建将在门户上呈现的“多选”字段。
在您的示例中,您需要创建 3 组字段。
这种方法的一些考虑因素是:
有一些可能的选项需要插件和自定义液体开发,但希望这种方法能够满足您的要求。
编辑:我对多选选项集和 Liquid 的经验有限,但我尝试创建一个 Web 模板,该模板返回带有联系人的 JSON,其中 cf_interests 字段是一个多选字段。
以下不是完整的答案
{% fetchxml feed %}
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false" count="10" returntotalrecordcount="true" {% if request.params['page'] %} page="{{request.params['page']}}" {% else %} page="1" {% endif %}>
<entity name="contact" >
<attribute name="fullname" />
<attribute name="cf_interests" />
<filter>
<condition attribute="statecode" operator="eq" value="0" />
{% if request.params['id'] %}
<condition attribute="contactid" operator="eq" value="{{ request.params['id' | xml_escape}}" />
{% endif %}
</filter>
</entity>
</fetch>
{% endfetchxml %}{
{% for contact in feed.results.entities %}
{
"fullname": "{{ contact.fullname}}",
"interest": "{{ contact.cf_interests | join: ", " }}"
"interests: "{% for interest in contact.cf_interests%}
{
"interest-{{forloop.index}}": "{{contact.cf_interest[{{forloop.index}}]}}"
}{% unless forloop.last %},{% endunless %}
{% endfor -%}
}{% unless forloop.last %},{% endunless %}
{% endfor -%}
}
理想情况下,这将使用他们的姓名和他们拥有的所有兴趣来提取所有联系人(如果作为参数传递,则通过 ID 联系)。这会在 XRM 工具箱中返回结果,但门户上没有任何内容:
获取使用:
获取结果:
JSON Web 模板的输出:
无论如何,一旦用户与您将创建的自定义多选控件进行交互,您就需要使用 Web api 来更新多选。我希望使用 JSON Web 模板来驱动该控件。
还有一个新类,您可以在插件中使用或通过 webapi 检索和设置多选选项集
https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/multi-select-picklist
我在创建和更新联系人时注册了一个简单的示例插件,它将选定的选项集值写入新字符串:
using System;
using System.ServiceModel;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
namespace PortalMultiSelect
{
public class ContactPostCreateUpdate : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
// Obtain the tracing service
ITracingService tracingService =
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
// Obtain the execution context from the service provider.
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
string className = "ContactPostCreateUpdate";
// The InputParameters collection contains all the data passed in the message request.
if (context.InputParameters.Contains("Target") &&
context.InputParameters["Target"] is Entity)
{
// Obtain the target entity from the input parameters.
Entity entity = (Entity)context.InputParameters["Target"];
// Obtain the organization service reference which you will need for
// web service calls.
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
tracingService.Trace("Message " + context.MessageName);
if (context.MessageName != "Create" && context.MessageName != "Update")
return;
if (context.Depth > 1)
return;
tracingService.Trace(string.Format("Primary EntityNname: {0} and Depth is: {1} ", context.PrimaryEntityName, context.Depth));
if (context.PrimaryEntityName != "contact")
return; //Should only be registerd on Contact Entity
try
{
Guid contactid = context.PrimaryEntityId;
Entity contact = service.Retrieve("contact", contactid, new ColumnSet(true));
tracingService.Trace("{0}: Setting up interest collection", className);
// It will returns the Collection of Values in the OptionSet.
OptionSetValueCollection interests = (OptionSetValueCollection)contact.Attributes["cf_interests"];
string interestValues = string.Empty;
StringBuilder sb = new StringBuilder();
tracingService.Trace("{0}: Joining interest values to string", className);
foreach (OptionSetValue interest in interests)
{
sb.Append(interest.Value).Append(";");
}
interestValues = sb.ToString(0, sb.Length - 1);
contact["cf_intereststring"] = interestValues;
service.Update(contact);
}
catch (FaultException<OrganizationServiceFault> ex)
{
throw new InvalidPluginExecutionException(string.Format("An error occurred in {0}. {1}", className, ex));
}
catch (Exception ex)
{
tracingService.Trace("{0}: {1}",className ,ex.ToString());
throw;
}
}
}
}
}
新的 TL:DR 多选选项集是新的,并且有很多限制。