diff --git a/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs b/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs index b72457727..44b0abb6a 100644 --- a/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs +++ b/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs @@ -20,6 +20,7 @@ namespace GeneXus.Http using Microsoft.AspNetCore.Http; #endif using GeneXus.Configuration; + using System.Reflection; public interface IHttpAjaxContext { @@ -346,20 +347,30 @@ public void ajax_rsp_assign_sdt_attri(String CmpContext, bool IsMasterPage, Stri try { JObject obj = GetGxObject(AttValues, CmpContext, IsMasterPage); - if (obj != null && (!isUndefinedOutParam(AttName, SdtObj) || DynAjaxEventContext.isParmModified(AttName, SdtObj))) - { - IGxJSONAble SdtObjJson = SdtObj as IGxJSONAble; - if (SdtObjJson != null) + if (obj != null) { + if (typeof(IGxExternalObject).IsAssignableFrom(SdtObj.GetType())) { - obj.Put(AttName, SdtObjJson.GetJSONObject()); + MethodInfo mth = SdtObj.GetType().GetMethod("tojson"); + obj.Put(AttName, mth?.Invoke(SdtObj, new Object[] {})); } else { - Array array = SdtObj as Array; - if (array != null) + if ((!isUndefinedOutParam(AttName, SdtObj) || DynAjaxEventContext.isParmModified(AttName, SdtObj))) { - JArray jArray = new JArray(array); - obj.Put(AttName, jArray); + IGxJSONAble SdtObjJson = SdtObj as IGxJSONAble; + if (SdtObjJson != null) + { + obj.Put(AttName, SdtObjJson.GetJSONObject()); + } + else + { + Array array = SdtObj as Array; + if (array != null) + { + JArray jArray = new JArray(array); + obj.Put(AttName, jArray); + } + } } } } diff --git a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs index 9505fde13..0b46cabb6 100644 --- a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs +++ b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs @@ -620,23 +620,23 @@ private PropertyInfo getpropertyInfo(object targetObj, string fieldName, ref obj private void SetNullableScalarOrCollectionValue(JObject parm, object value, JArray columnValues) { - string nullableAttribute = parm.Contains("nullAv") ? (string)parm["nullAv"] : null; - if (nullableAttribute != null && string.IsNullOrEmpty(JSONHelper.WriteJSON(value))) - { - SetScalarOrCollectionValue(nullableAttribute, true, null); - } - else - { - SetScalarOrCollectionValue((string)parm["av"], value, columnValues); + string nullableAttribute = parm.Contains("nullAv") ? (string)parm["nullAv"] : null; + if (nullableAttribute != null && string.IsNullOrEmpty(JSONHelper.WriteJSON(value))) + { + SetScalarOrCollectionValue(nullableAttribute, true, null); + } + else + { + SetScalarOrCollectionValue((string)parm["av"], value, columnValues); + } } - } private void SetScalarOrCollectionValue(string fieldName, object value, JArray values) { FieldInfo fieldInfo = getfieldInfo(targetObj, fieldName); if (fieldInfo != null) { - if (typeof(IGxCollection).IsAssignableFrom(fieldInfo.FieldType)) + if (typeof(IGxCollection).IsAssignableFrom(fieldInfo.FieldType)) SetCollectionFieldValue(fieldInfo, values); else SetFieldValue(fieldInfo, value); @@ -712,49 +712,58 @@ private void SetFieldValue(FieldInfo fieldInfo, object value) { if (fieldInfo != null) { - MethodInfo mth = fieldInfo.FieldType.GetMethod("FromJSONObject"); - if (mth != null) - mth.Invoke(fieldInfo.GetValue(targetObj), new Object[] { value }); + if (typeof(IGxExternalObject).IsAssignableFrom(fieldInfo.FieldType)) + { + MethodInfo mth = fieldInfo.FieldType.GetMethod("fromjson"); + mth?.Invoke(fieldInfo.GetValue(targetObj), new Object[] { value.ToString() }); + } else { - if (fieldInfo.FieldType.IsArray) - { - Array tempArray = GetArrayFieldValue(fieldInfo, value); - if (tempArray != null) - value = tempArray; - } - else if (fieldInfo.FieldType == typeof(DateTime) && value is String) - { - value = targetObj._Context.localUtil.CToT(value.ToString(), 0, 0); - } - else if (fieldInfo.FieldType == typeof(System.Guid)) - { - value = new Guid(value.ToString()); - } - else if (fieldInfo.FieldType == typeof(GeneXus.Utils.Geospatial)) - { - value = new GeneXus.Utils.Geospatial(value.ToString()); - } - if (fieldInfo.FieldType == typeof(Boolean)) + MethodInfo mth = fieldInfo.FieldType.GetMethod("FromJSONObject"); + if (mth != null) + mth.Invoke(fieldInfo.GetValue(targetObj), new Object[] { value }); + + else { - Boolean val = false; - if (!Boolean.TryParse(value.ToString(), out val)) + if (fieldInfo.FieldType.IsArray) { - GXLogging.Error(log, $"Could not parse boolean value '{value.ToString()}'"); + Array tempArray = GetArrayFieldValue(fieldInfo, value); + if (tempArray != null) + value = tempArray; } - value = val; - } - else - { + else if (fieldInfo.FieldType == typeof(DateTime) && value is String) + { + value = targetObj._Context.localUtil.CToT(value.ToString(), 0, 0); + } + else if (fieldInfo.FieldType == typeof(System.Guid)) + { + value = new Guid(value.ToString()); + } + else if (fieldInfo.FieldType == typeof(GeneXus.Utils.Geospatial)) + { + value = new GeneXus.Utils.Geospatial(value.ToString()); + } + if (fieldInfo.FieldType == typeof(Boolean)) + { + Boolean val = false; + if (!Boolean.TryParse(value.ToString(), out val)) + { + GXLogging.Error(log, $"Could not parse boolean value '{value.ToString()}'"); + } + value = val; + } + else + { #if NETCORE - IFormatProvider provider = CultureInfo.InvariantCulture; + IFormatProvider provider = CultureInfo.InvariantCulture; #else - IFormatProvider provider = CultureInfo.CreateSpecificCulture("en-US"); + IFormatProvider provider = CultureInfo.CreateSpecificCulture("en-US"); #endif - value = Convert.ChangeType(value, fieldInfo.FieldType, provider); + value = Convert.ChangeType(value, fieldInfo.FieldType, provider); + } + fieldInfo.SetValue(targetObj, value); } - fieldInfo.SetValue(targetObj, value); } } }