From c7387a2e5b9d8c2df61b56fc842038bd816d85ba Mon Sep 17 00:00:00 2001
From: Argo-Cloud
Date: Wed, 24 Mar 2021 17:09:43 +0800
Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=20SetError?=
=?UTF-8?q?=20=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ValidateForm/ValidateForm.razor.cs | 87 ++++++++-----------
1 file changed, 34 insertions(+), 53 deletions(-)
diff --git a/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs b/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs
index 90cfbb7ac..0ecc87ba8 100644
--- a/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs
+++ b/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs
@@ -15,7 +15,6 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
-using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BootstrapBlazor.Components
@@ -62,6 +61,7 @@ namespace BootstrapBlazor.Components
/// a value for .
///
[Parameter]
+ [NotNull]
public object? Model { get; set; }
///
@@ -97,17 +97,14 @@ namespace BootstrapBlazor.Components
{
var fieldName = exp.Member.Name;
var modelType = exp.Expression?.Type;
- if (modelType != null)
+ var validator = ValidatorCache.FirstOrDefault(c => c.Key.Model.GetType() == modelType && c.Key.FieldName == fieldName).Value;
+ if (validator != null)
{
- var validator = ValidatorCache.FirstOrDefault(c => c.Key.Model.GetType() == modelType && c.Key.FieldName == fieldName).Value;
- if (validator != null)
- {
- var results = new List
+ var results = new List
{
new ValidationResult(errorMessage, new string[] { fieldName })
};
- validator.ToggleMessage(results, true);
- }
+ validator.ToggleMessage(results, true);
}
}
}
@@ -115,63 +112,47 @@ namespace BootstrapBlazor.Components
///
/// 设置指定字段错误信息
///
- /// 字段名,可以使用多层,如 a.b.c
+ /// 字段名,可以使用多层,如 a.b.c
/// 错误描述信息,可为空,为空时查找资源文件
- public void SetError(string property, string errorMessage)
+ public void SetError(string propertyName, string errorMessage)
{
- if(Model == null)
- {
- return;
- }
- property = Regex.Replace(property, @"\[[^\]]*\]", string.Empty);
- List level = new List();
- if (property.Contains('.'))
- {
- level.AddRange(property.Split('.'));
- }
- else
- {
- level.Add(property);
- }
- Type objtype = Model.GetType();
- var pe = Expression.Parameter(objtype);
- var pro = objtype.GetProperty(level[0]);
- if(pro == null)
- {
- return;
- }
- var member = Expression.Property(pe, pro);
- for (int i = 1; i < level.Count; i++)
- {
- pro = member.Type.GetProperty(level[i]);
- if(pro == null)
- {
- return;
- }
- member = Expression.Property(member, pro);
- }
- var fieldName = member.Member.Name;
- var modelType = member.Expression?.Type;
- if (modelType != null)
+ if (TryGetModelField(propertyName, out var modelType, out var fieldName))
{
- var validator = ValidatorCache.FirstOrDefault(c => c.Key.Model.GetType() == modelType && c.Key.FieldName == fieldName).Value;
+ var validator = GetValidator(modelType, fieldName);
if (validator != null)
{
var results = new List
- {
- new ValidationResult(errorMessage, new string[] { fieldName })
- };
+ {
+ new ValidationResult(errorMessage, new string[] { fieldName })
+ };
validator.ToggleMessage(results, true);
}
}
+ }
+ private bool TryGetModelField(string propertyName, [MaybeNullWhen(false)] out Type modelType, [MaybeNullWhen(false)] out string fieldName)
+ {
+ var propNames = new ConcurrentQueue(propertyName.Split('.'));
+ var modelTypeInfo = Model.GetType();
+ modelType = null;
+ fieldName = null;
+ while (propNames.TryDequeue(out var propName))
+ {
+ modelType = modelTypeInfo;
+ fieldName = propName;
+ var propertyInfo = modelType.GetProperty(propName);
+ if (propertyInfo == null)
+ {
+ break;
+ }
+ var exp = Expression.Parameter(modelTypeInfo);
+ var member = Expression.Property(exp, propertyInfo);
+ modelTypeInfo = member.Type;
+ }
+ return propNames.IsEmpty;
}
- ///
- /// 通过指定的模型类型获取当前表单中的绑定属性
- ///
- ///
- internal IEnumerable<(FieldIdentifier, PropertyInfo PropertyInfo)> GetBindModelProperties() => ValidatorCache.Keys.Select(key => (key, key.Model.GetType().GetProperty(key.FieldName)!));
+ private IValidateComponent GetValidator(Type modelType, string fieldName) => ValidatorCache.FirstOrDefault(c => c.Key.Model.GetType() == modelType && c.Key.FieldName == fieldName).Value;
private static bool IsPublic(PropertyInfo p) => p.GetMethod != null && p.SetMethod != null && p.GetMethod.IsPublic && p.SetMethod.IsPublic;
--
Gitee
From aed6794e2c575fff6ba9b9b0c6d42f0cacc7eac8 Mon Sep 17 00:00:00 2001
From: Argo-Cloud
Date: Wed, 24 Mar 2021 17:09:56 +0800
Subject: [PATCH 2/5] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=20ValidateForm?=
=?UTF-8?q?=20=E7=A4=BA=E4=BE=8B=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Pages/Samples/ValidateForms.razor | 7 ++++---
.../Pages/Samples/ValidateForms.razor.cs | 14 +++++++++++---
2 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/src/BootstrapBlazor.Shared/Pages/Samples/ValidateForms.razor b/src/BootstrapBlazor.Shared/Pages/Samples/ValidateForms.razor
index 7c87c1a37..04727f5a9 100644
--- a/src/BootstrapBlazor.Shared/Pages/Samples/ValidateForms.razor
+++ b/src/BootstrapBlazor.Shared/Pages/Samples/ValidateForms.razor
@@ -76,7 +76,7 @@
应用场景
客户端验证通过后进行数据库保存操作,如果出现其他问题,后仍然可以进行表单自定义错误提示,本例中数据验证合法后,点击 提交表单 按钮后,姓名字段会显示 数据库中已存在 这样的自定义提示信息
-
+