31.10.2015, 13:45 | #1 |
Участник
|
Action crm 2015 online
Добрый день!
Не вдаваясь в детали технической реализации, интересует если ли возможность в Action вернут JSON объект, а не XML? |
|
31.10.2015, 16:20 | #2 |
Чайный пьяница
|
Напрямую нет. Другое дело, что в Output string поле можно положить JSon и уже его парсить более простым образом.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
31.10.2015, 21:47 | #3 |
Участник
|
Цитата:
Вот пример кода: Цитата:
using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Activities; using System.ServiceModel; using System.ServiceModel.Description; using System.Runtime.Serialization; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Workflow; using Microsoft.Xrm.Sdk.Client; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Client; using Microsoft.Xrm.Client.Services; namespace CrmConsoleApp { class Program { static void Main(string[] args) { var service = CrmConne.GetCrmService(); OrganizationRequest request = new OrganizationRequest("GetJsonDataToReport"); request["JsonParameters"] = "Hello"; OrganizationResponse response = service.Execute(request); string jsonResponseValue = (string)response.Results["JsonResonse"]; } } public static class CrmConne { public static IOrganizationService GetCrmService() { var connectionString = ConfigurationManager.ConnectionStrings["Xrm"].ConnectionString; var connection = CrmConnection.Parse(connectionString); return new OrganizationService(connection); } } } Последний раз редактировалось Ion; 31.10.2015 в 21:53. |
|
02.11.2015, 14:59 | #4 |
Moderator
|
Если не ошибаюсь, это работает не так. Экшен, как и любой кастомный объект имеет префикс издателя и должен вызываться как-то так: new_GetJsonDataToReportRequest
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
02.11.2015, 15:16 | #5 |
Участник
|
|
|
02.11.2015, 17:41 | #6 |
Чайный пьяница
|
Скриншот экшена приведите. Он ответит на все вопросы.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
02.11.2015, 18:19 | #7 |
Участник
|
Пересоздал экшн, опубликовал - все заработало
Все таки экшин это круто, правда, если можно было бы также лего сериализировать/десериализовать JSON - цены бы небыло) У меня вопрос: могу ли я безболезненно в Crm online юзать класс JavaScriptSerializer из System.Web.Extentions? |
|
02.11.2015, 22:41 | #8 |
Чайный пьяница
|
Цитата:
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
02.11.2015, 23:04 | #9 |
Участник
|
Цитата:
Сообщение от a33ik
К сожалению не получится потому что System.Web.Extensions недоступна в Sandbox. В своих проектах использую эту сборку - https://www.nuget.org/packages/newtonsoft.json/ Потом при помощи ILMerge собираю всё в одну сборку.
|
|
02.11.2015, 23:24 | #10 |
Участник
|
А я же могу заюзать System.Runtime.Serialization.Json, эта же сборка доступна и будет работать в срм онлайн.
|
|
03.11.2015, 00:14 | #11 |
Чайный пьяница
|
Цитата:
Не пробовал использовать, потому не могу поделиться опытом.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
05.11.2015, 11:16 | #12 |
Участник
|
Цитата:
Сообщение от a33ik
Я буквально недавно был вынужден пользоваться этим, так что как я это сделал можете почитать тут - http://a33ik.blogspot.com/2015/07/ho...r-toolkit.html
Не пробовал использовать, потому не могу поделиться опытом. Искользовать крайне просто string jsonString = JsonHelper.JsonSerializer<JsonReportData>(JsonReportDataInstance); Код: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Runtime.Serialization.Json; using System.IO; using System.Text; /// <summary> /// JSON Serialization and Deserialization Assistant Class /// </summary> public class JsonHelper { /// <summary> /// JSON Serialization /// </summary> public static string JsonSerializer<T>(T t) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(); ser.WriteObject(ms, t); string jsonString = Encoding.UTF8.GetString(ms.ToArray()); ms.Close(); return jsonString; } /// <summary> /// JSON Deserialization /// </summary> public static T JsonDeserialize<T>(string jsonString) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); T obj = (T)ser.ReadObject(ms); return obj; } } Код: class JsonReportData { public DateTime StartDate { get; set; } public DateTime DueDate { get; set; } public List<Guid> SalesPersonList { get; set; } public List<int> ProbabilityStage { get; set; } public Dictionary<string, Guid> SalesPersonKeyValuePair { get; set; } } |
|
|
За это сообщение автора поблагодарили: a33ik (1). |
12.11.2015, 22:08 | #13 |
Участник
|
На самом деле сейчас крайне опечален.
Пишу в данный момент работаю с IFD 2015 версия. Пытаюсь воспользоваться Вашей a33ik библиотекой , но не могу вызвать экшен из JS. Request сгенерировал используя SoapLoggerOrganizationService. Вот пример кода X++: <!doctype html> <html ng-app="purchaseApp"> <head> <meta charset="utf-8"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> </head> <body ng-controller="purchaseController"> <div class="page-header"> <h1>Test Action </h1> </div> <div class="panel"> <div class="form-inline"> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-8"> <button class="btn btn-default" id="crmAction">Execute action</button> </div> </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.11/angular.min.js"></script> <script src="/WebResources/new_CustomActionExecutor.js"></script> <script> document.getElementById("crmAction").addEventListener("click", executeAction); function executeAction() { debugger; var parameters = "test"; CustomActionExecutor.Execute( { requestXml: getRequestXml(parameters), async: true, successCallback: function(result){ }, errorCallback: function (e) { } }); } function getRequestXml(parameters) { var requestXml = ''; requestXml += "</s:Envelope><s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>"; requestXml += "<s:Body>"; requestXml += "<Execute xmlns='http://schemas.microsoft.com/xrm/2011/Contracts/Services' xmlns:i='http://www.w3.org/2001/XMLSchema-instance'>"; requestXml += "<request xmlns:a='http://schemas.microsoft.com/xrm/2011/Contracts'>"; requestXml += "<a:Parameters xmlns:b='http://schemas.datacontract.org/2004/07/System.Collections.Generic'>"; requestXml += "<a:KeyValuePairOfstringanyType>"; requestXml += "<b:key>JsonParameters</b:key>"; requestXml += "<b:value i:type='c:string' xmlns:c='http://www.w3.org/2001/XMLSchema'>" + parameters + "</b:value>"; requestXml += "</a:KeyValuePairOfstringanyType>"; requestXml += "</a:Parameters>"; requestXml += "<a:RequestId i:nil='true' />"; requestXml += "<a:RequestName>new_GetJsonDataToReport</a:RequestName>"; requestXml += "</request>"; requestXml += "</Execute>"; requestXml += "</s:Body>"; requestXml += "</s:Envelope>"; return requestXml; } </script> </body> </html> Если вызывать из console app, то все норм X++: OrganizationRequest r = new OrganizationRequest("new_GetJsonDataToReport"); r["JsonParameters"] = JsonHelper.JsonSerializer<JsonReportDate>(PrepareJsonData()); OrganizationResponse response = service.Execute(request); Последний раз редактировалось Ion; 12.11.2015 в 22:11. |
|
15.11.2015, 02:21 | #14 |
Чайный пьяница
|
Есть 2 рекомендации:
1. Добавить ссылку на ClientGlobalContext. 2. Использовать относительную адресацию в ссылках на вебресурс.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
17.11.2015, 12:50 | #15 |
Участник
|
Спасибо, проблему решил. Правда вариант 1 у меня пока не работает, потому есть баг с ClientGlobalContex в срм 2015 ifd. Ролап #1 еще не накатывал, ms говорит что он решен
|
|
18.11.2015, 13:07 | #16 |
Участник
|
Задеплоил решение в СРМ онлайн, там тоже почему-то не подгружаеться файл СlientGlobalContext.js.aspx.
Использую такую адрессацию X++: <script src="../../ClientGlobalContext.js.aspx"></script> <script src="../ClientGlobalContext.js.aspx"></script> |
|
18.11.2015, 14:36 | #17 |
Участник
|
Разобрался, просто надо было писать так))))
X++: <script src="ClientGlobalContext.js.aspx"></script> |
|
|
|