Передача значений из формы сущности Dynamics CRM во внешний веб-сервис с помощью метода выполнения подключаемого модуля - PullRequest
0 голосов
/ 09 февраля 2020

Я хочу передать внешнему веб-сервису некоторые значения сущности (случай / инцидент) во время создания новой записи.

У меня есть модель для подготовки данных, которые необходимо отправить в Интернет сервис, как показано ниже:

public class TicketViewModel
{
    public string CaseID { get; set; }
    public string Subject { get; set; }
    public string Description { get; set; }
    public string CreateTime { get; set; }
    public string Owner { get; set; }
    public string States { get; set; }
    public string Assigned { get; set; }
}

Вот мой код внутри метода Execute ():

IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));

            IOrganizationService service = factory.CreateOrganizationService(context.UserId);

            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                try
                {
                    var entity = (Entity)context.InputParameters["Target"];
                    if (entity.LogicalName != "incident") // The logical name for Case entity
                        return;

                    Guid recordID = entity.Id;

                    var ticket = new CaseViewModel
                    {
                        // Retrieving Intended Fields Value
                    };

                    BasicHttpBinding httpBinding = new BasicHttpBinding();
                    httpBinding.Name = "HttpBinding_Service";
                    httpBinding.Security.Mode = BasicHttpSecurityMode.None;
                    httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
                    httpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
                    httpBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

                    EndpointAddress epa = new EndpointAddress(@"webservice/url/address");
                    CallChamberPortalSoapClient tcClient = new CallChamberPortalSoapClient(httpBinding, epa);

                    var res = tcClient.addTicket(//Passing Intended Fields Value);

                    entity["X"] = res.ToString();
                }
                catch (Exception ex)
                {
                    throw new InvalidPluginExecutionException("Failed to register ticket by this error: " + ex.Message);
                }
  1. Мой первый вопрос: как получить значение предполагаемых полей при создании новой записи? Я использовал entity ["X"], чтобы получить значение поля "X", но ничего не возвращалось.
  2. Мой второй вопрос: как установить значение поля при обновлении записи? Использование того же выражения (entity ["X"] = "NewValue") для меня не сработало.

Примечание: примерные данные stati c успешно отправлены в веб-службу и в результате вернули значение true.

РЕДАКТИРОВАТЬ:

Я пытался получить значения, как показано ниже, но произошла ошибка в событии создания записи CRM.

ColumnSet cs = new ColumnSet(new string[] {
   "ticketnumber", "title", "description", "createdon", "customerid", "new_peygiriii", "createdby" });
    Entity wholeCase = service.Retrieve("incident", recordID, cs);

Owner = wholeCase.GetAttributeValue<EntityReference>("customerid").ToString();

Ошибка:

Невозможно привести объект типа Microsoft.Xrm.Sdk.OptionSetValue к типу Microsoft.Xrm.Sdk.EntityReference

Спасибо .

1 Ответ

1 голос
/ 09 февраля 2020

Во-первых, вы должны зарегистрировать свой плагин в Dynamics как операция Post (создать). Причина, когда запись создана в System, вы получите ее Guid и так далее. Это лучший способ и, кроме того, сделать ваш плагин асинхронным (только если он необходим для вашего случая использования).

Теперь, когда вы создаете запись в плагине crm, вы получите его контекст, как вы делаете.

 var entity = (Entity)context.InputParameters["Target"];

теперь вы можете получить определенное значение для fileds, вы делаете что-то вроде ниже

  if(entity.contains("field name")){
    var recordName=entity.GetAttributeValue<string>("field name");
    }

, если вам нужны значения параметров, вы делаете что-то вроде ниже

if(entity.contains("optionset field name")){
    int selectedTopic = entity.GetAttributeValue<OptionSetValue>("optionset field name").Value
String text = entity.FormattedValues["optionset field name"].ToString();


    }

Установить? какой тип данных вы хотите настроить, при условии, что вы хотите установить значение набора параметров

entity["X"] = new OptionSetValue(INDEX)

INDEX - это целое число, которое вы можете найти в редакторе набора параметров (значения по умолчанию - несколько di git long ).

...