Browse Source

Handle floating numbers on extension properties.

pull/4003/head
Halil İbrahim Kalkan 6 years ago
parent
commit
c17868e5ac
  1. 20
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Extensions/TagHelperExtensions.cs
  2. 40
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs
  3. 17
      framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/ObjectExtending/MvcUiObjectExtensionPropertyInfoExtensions.cs
  4. 1
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpExtraPropertiesDictionaryModelBinderProvider.cs
  5. 6
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpExtraPropertyModelBinder.cs
  6. 56
      framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs

20
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Extensions/TagHelperExtensions.cs

@ -7,14 +7,26 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions
{ {
public static class TagHelperExtensions public static class TagHelperExtensions
{ {
public static async Task<TagHelperOutput> ProcessAndGetOutputAsync(this TagHelper tagHelper, TagHelperAttributeList attributeList, TagHelperContext context, string tagName = "div", TagMode tagMode = TagMode.SelfClosing) public static async Task<TagHelperOutput> ProcessAndGetOutputAsync(
this TagHelper tagHelper,
TagHelperAttributeList attributeList,
TagHelperContext context,
string tagName = "div",
TagMode tagMode = TagMode.SelfClosing)
{ {
var innerOutput = new TagHelperOutput(tagName, attributeList, (useCachedResult, encoder) => Task.Run<TagHelperContent>(() => new DefaultTagHelperContent())) var innerOutput = new TagHelperOutput(
tagName,
attributeList,
(useCachedResult, encoder) => Task.Run<TagHelperContent>(() => new DefaultTagHelperContent()))
{ {
TagMode = tagMode TagMode = tagMode
}; };
var innerContext = new TagHelperContext(attributeList, context.Items, Guid.NewGuid().ToString()); var innerContext = new TagHelperContext(
attributeList,
context.Items,
Guid.NewGuid().ToString()
);
tagHelper.Init(context); tagHelper.Init(context);

40
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs

@ -115,22 +115,40 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
}; };
} }
return new InputTagHelper(_generator) var inputTagHelper = new InputTagHelper(_generator)
{ {
For = TagHelper.AspFor, For = TagHelper.AspFor,
InputTypeName = TagHelper.InputTypeName, InputTypeName = TagHelper.InputTypeName,
ViewContext = TagHelper.ViewContext, ViewContext = TagHelper.ViewContext
Format = TagHelper.Format,
Name = TagHelper.Name,
Value = TagHelper.Value
}; };
if (!TagHelper.Format.IsNullOrEmpty())
{
inputTagHelper.Format = TagHelper.Format;
}
if (!TagHelper.Name.IsNullOrEmpty())
{
inputTagHelper.Name = TagHelper.Name;
}
if (!TagHelper.Value.IsNullOrEmpty())
{
inputTagHelper.Value = TagHelper.Value;
}
return inputTagHelper;
} }
protected virtual async Task<(TagHelperOutput, bool)> GetInputTagHelperOutputAsync(TagHelperContext context, TagHelperOutput output) protected virtual async Task<(TagHelperOutput, bool)> GetInputTagHelperOutputAsync(TagHelperContext context, TagHelperOutput output)
{ {
var tagHelper = GetInputTagHelper(context, output); var tagHelper = GetInputTagHelper(context, output);
var inputTagHelperOutput = await tagHelper.ProcessAndGetOutputAsync(GetInputAttributes(context, output), context, "input"); var inputTagHelperOutput = await tagHelper.ProcessAndGetOutputAsync(
GetInputAttributes(context, output),
context,
"input"
);
ConvertToTextAreaIfTextArea(inputTagHelperOutput); ConvertToTextAreaIfTextArea(inputTagHelperOutput);
AddDisabledAttribute(inputTagHelperOutput); AddDisabledAttribute(inputTagHelperOutput);
@ -349,6 +367,16 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
attrList.Add("type", TagHelper.InputTypeName); attrList.Add("type", TagHelper.InputTypeName);
} }
if (!TagHelper.Name.IsNullOrEmpty() && !attrList.ContainsName("name"))
{
attrList.Add("name", TagHelper.Name);
}
if (!TagHelper.Value.IsNullOrEmpty() && !attrList.ContainsName("value"))
{
attrList.Add("value", TagHelper.Value);
}
return attrList; return attrList;
} }

17
framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/ObjectExtending/MvcUiObjectExtensionPropertyInfoExtensions.cs

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Reflection;
namespace Volo.Abp.ObjectExtending namespace Volo.Abp.ObjectExtending
{ {
@ -49,6 +50,22 @@ namespace Volo.Abp.ObjectExtending
return null; return null;
} }
public static string GetInputValueOrNull(this IBasicObjectExtensionPropertyInfo property, object value)
{
if (value == null)
{
return null;
}
if (TypeHelper.IsFloatingType(property.Type))
{
return value.ToString()?.Replace(',', '.');
}
/* Let the ASP.NET Core handle it! */
return null;
}
public static string GetInputType(this ObjectExtensionPropertyInfo propertyInfo) public static string GetInputType(this ObjectExtensionPropertyInfo propertyInfo)
{ {
foreach (var attribute in propertyInfo.Attributes) foreach (var attribute in propertyInfo.Attributes)

1
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpExtraPropertiesDictionaryModelBinderProvider.cs

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ModelBinding.Binders; using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;

6
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpExtraPropertyModelBinder.cs

@ -1,5 +1,4 @@
using System; using System;
using System.ComponentModel;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
@ -61,7 +60,10 @@ namespace Volo.Abp.AspNetCore.Mvc.ModelBinding
return value; return value;
} }
return TypeHelper.ConvertFromString(propertyInfo.Type, value); return TypeHelper.ConvertFromString(
propertyInfo.Type,
value
);
} }
} }
} }

56
framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs

@ -2,14 +2,23 @@
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Localization;
namespace Volo.Abp.Reflection namespace Volo.Abp.Reflection
{ {
public static class TypeHelper public static class TypeHelper
{ {
private static readonly HashSet<Type> FloatingTypes = new HashSet<Type>
{
typeof(float),
typeof(double),
typeof(decimal)
};
private static readonly HashSet<Type> NonNullablePrimitiveTypes = new HashSet<Type> private static readonly HashSet<Type> NonNullablePrimitiveTypes = new HashSet<Type>
{ {
typeof(byte), typeof(byte),
@ -40,7 +49,7 @@ namespace Volo.Abp.Reflection
{ {
return false; return false;
} }
var type = obj.GetType(); var type = obj.GetType();
if (!type.GetTypeInfo().IsGenericType) if (!type.GetTypeInfo().IsGenericType)
{ {
@ -169,7 +178,7 @@ namespace Volo.Abp.Reflection
{ {
return Activator.CreateInstance(type); return Activator.CreateInstance(type);
} }
return null; return null;
} }
@ -297,9 +306,39 @@ namespace Volo.Abp.Reflection
public static object ConvertFromString(Type targetType, string value) public static object ConvertFromString(Type targetType, string value)
{ {
return TypeDescriptor if (value == null)
.GetConverter(targetType) {
.ConvertFromString(value); return null;
}
var converter = TypeDescriptor.GetConverter(targetType);
if (IsFloatingType(targetType))
{
using (CultureHelper.Use(CultureInfo.InvariantCulture))
{
return converter.ConvertFromString(value.Replace(',', '.'));
}
}
return converter.ConvertFromString(value);
}
public static bool IsFloatingType(Type type, bool includeNullable = true)
{
if (FloatingTypes.Contains(type))
{
return true;
}
if (includeNullable &&
IsNullable(type) &&
FloatingTypes.Contains(type.GenericTypeArguments[0]))
{
return true;
}
return false;
} }
public static object ConvertFrom<TTargetType>(object value) public static object ConvertFrom<TTargetType>(object value)
@ -313,5 +352,12 @@ namespace Volo.Abp.Reflection
.GetConverter(targetType) .GetConverter(targetType)
.ConvertFrom(value); .ConvertFrom(value);
} }
public static Type StripNullable(Type type)
{
return IsNullable(type)
? type.GenericTypeArguments[0]
: type;
}
} }
} }

Loading…
Cancel
Save