Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 20 additions & 9 deletions dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ namespace GeneXus.Http
using Microsoft.AspNetCore.Http;
#endif
using GeneXus.Configuration;
using System.Reflection;

public interface IHttpAjaxContext
{
Expand Down Expand Up @@ -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);
}
}
}
}
}
Expand Down
95 changes: 52 additions & 43 deletions dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<dynamic>(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<dynamic>(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);
Expand Down Expand Up @@ -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);
}
}
}
Expand Down
Loading