Explorar el Código

优化FromBodyOrDefaultModelBinder的异常处理逻辑

增加对JSON字符串类型的特殊处理,支持通过TryConvertTo方法转换为目标模型类型。引入exception变量捕获绑定过程中的异常,并在绑定完成后抛出捕获的异常以便更好地调试和日志记录。
懒得勤快 hace 4 semanas
padre
commit
b5c70e1ade

+ 15 - 1
Masuit.Tools.AspNetCore/ModelBinder/FromBodyOrDefaultModelBinder.cs

@@ -30,6 +30,7 @@ public class FromBodyOrDefaultModelBinder(ILogger<FromBodyOrDefaultModelBinder>
         var field = attr?.FieldName ?? bindingContext.FieldName;
         var modelType = bindingContext.ModelType;
         object value = null;
+        Exception exception = null;
         if (attr != null)
         {
             if (modelType.IsSimpleType() || modelType.IsSimpleArrayType() || modelType.IsSimpleListType())
@@ -65,7 +66,14 @@ public class FromBodyOrDefaultModelBinder(ILogger<FromBodyOrDefaultModelBinder>
                     {
                         if (json.TryGetValue(field, StringComparison.OrdinalIgnoreCase, out var jtoken))
                         {
-                            value = jtoken.ToObject(modelType);
+                            if (jtoken.Type is JTokenType.String)
+                            {
+                                jtoken.Value<string>().TryConvertTo(modelType, out value);
+                            }
+                            else
+                            {
+                                value = jtoken.ToObject(modelType);
+                            }
                         }
                         else
                         {
@@ -82,6 +90,7 @@ public class FromBodyOrDefaultModelBinder(ILogger<FromBodyOrDefaultModelBinder>
                         catch (Exception e)
                         {
                             logger.LogError(e, e.Message, json.ToString());
+                            exception = e;
                         }
                     }
                 }
@@ -153,6 +162,11 @@ public class FromBodyOrDefaultModelBinder(ILogger<FromBodyOrDefaultModelBinder>
             bindingContext.Result = ModelBindingResult.Success(value);
         }
 
+        if (exception != null)
+        {
+            throw exception;
+        }
+
         return Task.CompletedTask;
     }