懒得勤快 3 年之前
父節點
當前提交
719253e764

+ 3 - 3
Masuit.Tools.AspNetCore/Masuit.Tools.AspNetCore.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk.Web">
 
     <PropertyGroup>
-        <TargetFrameworks>netcoreapp3.1;net5.0;net6.0</TargetFrameworks>
+        <TargetFrameworks>netcoreapp2.1;netcoreapp3.1;net5.0;net6.0</TargetFrameworks>
         <Description>
             包含一些AspNetCore常用的工具类。ModelBinder等
             官网教程:https://ldqk.org/55
@@ -9,7 +9,7 @@
         </Description>
         <Copyright>Copyright © 懒得勤快</Copyright>
         <PackageProjectUrl>https://github.com/ldqk/Masuit.Tools</PackageProjectUrl>
-        <PackageTags>Masuit.Tools,工具库,Utility,Crypt,Extensions</PackageTags>
+        <PackageTags>Masuit.Tools,工具库,Utility,ModelBinder</PackageTags>
         <PackageReleaseNotes>如有问题请联系作者QQ:3444764617,或者到项目的github反馈问题,详细的API文档在github上:https://github.com/ldqk/Masuit.Tools</PackageReleaseNotes>
         <PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
         <PackageLicenseUrl>https://github.com/ldqk/Masuit.Tools/blob/master/LICENSE</PackageLicenseUrl>
@@ -18,7 +18,7 @@
         <LangVersion>latest</LangVersion>
         <RepositoryType>Github</RepositoryType>
         <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-        <Version>1.0</Version>
+        <Version>1.0.1</Version>
         <FileVersion>1.0</FileVersion>
         <Company>masuit.com</Company>
         <AssemblyVersion>1.0</AssemblyVersion>

+ 10 - 16
Masuit.Tools.AspNetCore/ModelBinder/BodyOrDefaultBindingSource.cs

@@ -1,23 +1,17 @@
 using Microsoft.AspNetCore.Mvc.ModelBinding;
 
-namespace Masuit.Tools.AspNetCore.ModelBinder
+namespace Masuit.Tools.AspNetCore.ModelBinder;
+
+public class BodyOrDefaultBindingSource : BindingSource
 {
-    public class BodyOrDefaultBindingSource : BindingSource
-    {
-        public static readonly BindingSource BodyOrDefault = new BodyOrDefaultBindingSource(
-            "BodyOrDefault",
-            "BodyOrDefault",
-            true,
-            true
-            );
+    public static readonly BindingSource BodyOrDefault = new BodyOrDefaultBindingSource("BodyOrDefault", "BodyOrDefault", true, true);
 
-        public BodyOrDefaultBindingSource(string id, string displayName, bool isGreedy, bool isFromRequest) : base(id, displayName, isGreedy, isFromRequest)
-        {
-        }
+    public BodyOrDefaultBindingSource(string id, string displayName, bool isGreedy, bool isFromRequest) : base(id, displayName, isGreedy, isFromRequest)
+    {
+    }
 
-        public override bool CanAcceptDataFrom(BindingSource bindingSource)
-        {
-            return bindingSource == Body || bindingSource == this;
-        }
+    public override bool CanAcceptDataFrom(BindingSource bindingSource)
+    {
+        return bindingSource == Body || bindingSource == this;
     }
 }

+ 59 - 60
Masuit.Tools.AspNetCore/ModelBinder/BodyOrDefaultModelBinder.cs

@@ -6,86 +6,85 @@ using Microsoft.AspNetCore.Mvc.ModelBinding;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 
-namespace Masuit.Tools.AspNetCore.ModelBinder
+namespace Masuit.Tools.AspNetCore.ModelBinder;
+
+public class BodyOrDefaultModelBinder : IModelBinder
 {
-    public class BodyOrDefaultModelBinder : IModelBinder
+    private readonly IModelBinder _bodyBinder;
+    private readonly IModelBinder _complexBinder;
+
+    public BodyOrDefaultModelBinder(IModelBinder bodyBinder, IModelBinder complexBinder)
     {
-        private readonly IModelBinder _bodyBinder;
-        private readonly IModelBinder _complexBinder;
+        _bodyBinder = bodyBinder;
+        _complexBinder = complexBinder;
+    }
 
-        public BodyOrDefaultModelBinder(IModelBinder bodyBinder, IModelBinder complexBinder)
-        {
-            _bodyBinder = bodyBinder;
-            _complexBinder = complexBinder;
-        }
+    public async Task BindModelAsync(ModelBindingContext bindingContext)
+    {
+        var request = bindingContext.HttpContext.Request;
+        request.EnableBuffering();
+        var buffer = new byte[Convert.ToInt32(request.ContentLength)];
+        _ = await request.Body.ReadAsync(buffer, 0, buffer.Length);
+        var text = Encoding.UTF8.GetString(buffer);
+        request.Body.Position = 0;
 
-        public async Task BindModelAsync(ModelBindingContext bindingContext)
+        if (bindingContext.ModelType.IsPrimitive || bindingContext.ModelType == typeof(string) || bindingContext.ModelType.IsEnum || bindingContext.ModelType == typeof(DateTime) || bindingContext.ModelType == typeof(Guid))
         {
-            var request = bindingContext.HttpContext.Request;
-            request.EnableBuffering();
-            var buffer = new byte[Convert.ToInt32(request.ContentLength)];
-            _ = await request.Body.ReadAsync(buffer, 0, buffer.Length);
-            var text = Encoding.UTF8.GetString(buffer);
-            request.Body.Position = 0;
-
-            if (bindingContext.ModelType.IsPrimitive || bindingContext.ModelType == typeof(string) || bindingContext.ModelType.IsEnum || bindingContext.ModelType == typeof(DateTime) || bindingContext.ModelType == typeof(Guid))
+            var parameter = bindingContext.ModelMetadata.ParameterName;
+            var value = "";
+            if (request.Query.ContainsKey(parameter))
             {
-                var parameter = bindingContext.ModelMetadata.ParameterName;
-                var value = "";
-                if (request.Query.ContainsKey(parameter))
-                {
-                    value = request.Query[parameter] + "";
-                }
-                else if (request.ContentType.StartsWith("application/json"))
-                {
-                    value = JObject.Parse(text)[parameter] + "";
-                }
-                else if (request.HasFormContentType)
-                {
-                    value = request.Form[bindingContext.ModelMetadata.ParameterName] + "";
-                }
-
-                if (value.TryConvertTo(bindingContext.ModelType, out var result))
-                {
-                    bindingContext.Result = ModelBindingResult.Success(result);
-                }
-                return;
+                value = request.Query[parameter] + "";
             }
-
-            if (request.HasFormContentType)
+            else if (request.ContentType.StartsWith("application/json"))
+            {
+                value = JObject.Parse(text)[parameter] + "";
+            }
+            else if (request.HasFormContentType)
             {
-                if (bindingContext.ModelType.IsClass)
-                {
-                    await DefaultBindModel(bindingContext);
-                }
-                else
-                {
-                    bindingContext.Result = ModelBindingResult.Success(request.Form[bindingContext.ModelMetadata.ParameterName].ToString().ConvertTo(bindingContext.ModelType));
-                }
-                return;
+                value = request.Form[bindingContext.ModelMetadata.ParameterName] + "";
             }
 
-            try
+            if (value.TryConvertTo(bindingContext.ModelType, out var result))
             {
-                bindingContext.Result = ModelBindingResult.Success(JsonConvert.DeserializeObject(text, bindingContext.ModelType) ?? request.Query[bindingContext.ModelMetadata.ParameterName!].ToString().ConvertTo(bindingContext.ModelType));
+                bindingContext.Result = ModelBindingResult.Success(result);
             }
-            catch
+            return;
+        }
+
+        if (request.HasFormContentType)
+        {
+            if (bindingContext.ModelType.IsClass)
             {
                 await DefaultBindModel(bindingContext);
             }
+            else
+            {
+                bindingContext.Result = ModelBindingResult.Success(request.Form[bindingContext.ModelMetadata.ParameterName].ToString().ConvertTo(bindingContext.ModelType));
+            }
+            return;
         }
 
-        private async Task DefaultBindModel(ModelBindingContext bindingContext)
+        try
         {
-            await _bodyBinder.BindModelAsync(bindingContext);
+            bindingContext.Result = ModelBindingResult.Success(JsonConvert.DeserializeObject(text, bindingContext.ModelType) ?? request.Query[bindingContext.ModelMetadata.ParameterName!].ToString().ConvertTo(bindingContext.ModelType));
+        }
+        catch
+        {
+            await DefaultBindModel(bindingContext);
+        }
+    }
 
-            if (bindingContext.Result.IsModelSet)
-            {
-                return;
-            }
+    private async Task DefaultBindModel(ModelBindingContext bindingContext)
+    {
+        await _bodyBinder.BindModelAsync(bindingContext);
 
-            bindingContext.ModelState.Clear();
-            await _complexBinder.BindModelAsync(bindingContext);
+        if (bindingContext.Result.IsModelSet)
+        {
+            return;
         }
+
+        bindingContext.ModelState.Clear();
+        await _complexBinder.BindModelAsync(bindingContext);
     }
 }

+ 18 - 18
Masuit.Tools.AspNetCore/ModelBinder/BodyOrDefaultModelBinderProvider.cs

@@ -1,5 +1,6 @@
 using Microsoft.AspNetCore.Mvc.ModelBinding;
 using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
+
 #if NET5_0_OR_GREATER
 
 using ComplexDataModelBinderProvider = Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexObjectModelBinderProvider;
@@ -10,28 +11,27 @@ using ComplexDataModelBinderProvider = Microsoft.AspNetCore.Mvc.ModelBinding.Bin
 
 #endif
 
-namespace Masuit.Tools.AspNetCore.ModelBinder
+namespace Masuit.Tools.AspNetCore.ModelBinder;
+
+public class BodyOrDefaultModelBinderProvider : IModelBinderProvider
 {
-    public class BodyOrDefaultModelBinderProvider : IModelBinderProvider
-    {
-        private BodyModelBinderProvider _bodyModelBinderProvider;
-        private ComplexDataModelBinderProvider _complexDataModelBinderProvider;
+    private readonly BodyModelBinderProvider _bodyModelBinderProvider;
+    private readonly ComplexDataModelBinderProvider _complexDataModelBinderProvider;
 
-        public BodyOrDefaultModelBinderProvider(BodyModelBinderProvider bodyModelBinderProvider, ComplexDataModelBinderProvider complexDataModelBinderProvider)
-        {
-            _bodyModelBinderProvider = bodyModelBinderProvider;
-            _complexDataModelBinderProvider = complexDataModelBinderProvider;
-        }
+    public BodyOrDefaultModelBinderProvider(BodyModelBinderProvider bodyModelBinderProvider, ComplexDataModelBinderProvider complexDataModelBinderProvider)
+    {
+        _bodyModelBinderProvider = bodyModelBinderProvider;
+        _complexDataModelBinderProvider = complexDataModelBinderProvider;
+    }
 
-        public IModelBinder GetBinder(ModelBinderProviderContext context)
+    public IModelBinder GetBinder(ModelBinderProviderContext context)
+    {
+        if (context.BindingInfo.BindingSource != null && context.BindingInfo.BindingSource.CanAcceptDataFrom(BodyOrDefaultBindingSource.BodyOrDefault))
         {
-            if (context.BindingInfo.BindingSource != null && context.BindingInfo.BindingSource.CanAcceptDataFrom(BodyOrDefaultBindingSource.BodyOrDefault))
-            {
-                var bodyBinder = _bodyModelBinderProvider.GetBinder(context);
-                var complexBinder = _complexDataModelBinderProvider.GetBinder(context);
-                return new BodyOrDefaultModelBinder(bodyBinder, complexBinder);
-            }
-            return null;
+            var bodyBinder = _bodyModelBinderProvider.GetBinder(context);
+            var complexBinder = _complexDataModelBinderProvider.GetBinder(context);
+            return new BodyOrDefaultModelBinder(bodyBinder, complexBinder);
         }
+        return null;
     }
 }

+ 8 - 11
Masuit.Tools.AspNetCore/ModelBinder/BodyOrDefaultModelBinderProviderSetup.cs

@@ -2,6 +2,7 @@
 using System.Linq;
 using Microsoft.AspNetCore.Mvc.ModelBinding;
 using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
+
 #if NET5_0_OR_GREATER
 
 using ComplexDataModelBinderProvider = Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexObjectModelBinderProvider;
@@ -12,18 +13,14 @@ using ComplexDataModelBinderProvider = Microsoft.AspNetCore.Mvc.ModelBinding.Bin
 
 #endif
 
-namespace Masuit.Tools.AspNetCore.ModelBinder
+namespace Masuit.Tools.AspNetCore.ModelBinder;
+
+public static class BodyOrDefaultModelBinderProviderSetup
 {
-    public static class BodyOrDefaultModelBinderProviderSetup
+    public static void InsertBodyOrDefaultBinding(this IList<IModelBinderProvider> providers)
     {
-        public static void InsertBodyOrDefaultBinding(this IList<IModelBinderProvider> providers)
-        {
-            var bodyProvider = providers.Single(provider => provider.GetType() == typeof(BodyModelBinderProvider)) as BodyModelBinderProvider;
-            var complexDataProvider = providers.OfType<ComplexDataModelBinderProvider>().Single();
-
-            var bodyOrDefault = new BodyOrDefaultModelBinderProvider(bodyProvider, complexDataProvider);
-
-            providers.Insert(0, bodyOrDefault);
-        }
+        var bodyProvider = providers.OfType<BodyModelBinderProvider>().Single();
+        var complexDataProvider = providers.OfType<ComplexDataModelBinderProvider>().Single();
+        providers.Insert(0, new BodyOrDefaultModelBinderProvider(bodyProvider, complexDataProvider));
     }
 }

+ 5 - 6
Masuit.Tools.AspNetCore/ModelBinder/FromBodyOrDefaultAttribute.cs

@@ -1,11 +1,10 @@
 using System;
 using Microsoft.AspNetCore.Mvc.ModelBinding;
 
-namespace Masuit.Tools.AspNetCore.ModelBinder
+namespace Masuit.Tools.AspNetCore.ModelBinder;
+
+[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)]
+public class FromBodyOrDefaultAttribute : Attribute, IBindingSourceMetadata
 {
-    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
-    public class FromBodyOrDefaultAttribute : Attribute, IBindingSourceMetadata
-    {
-        public BindingSource BindingSource => BodyOrDefaultBindingSource.BodyOrDefault;
-    }
+    public BindingSource BindingSource => BodyOrDefaultBindingSource.BodyOrDefault;
 }