据我了解,.NET Core 中的 ModelState 返回这样的结构:
{
"Field1": [ "error1", "error2" ],
"Field2.NestedField": [ "error1", "error2 ],
"CollectionField[3]": [ "error1", "error2"]
}
现在,如果我在 Controller 中进行一些额外的自定义验证(例如,如果 ids 引用的实体存在则进行数据库查询),我需要将 key 设置为字符串。
我只是不知道如何构建获取这些格式的 key 。 这种格式有名称吗?
使用 name of 只会给出字段的名称,而不给出父字段。
有没有一种简单的方法来生成这些名称?
最佳答案
Using name of does give only the name of the field but not the parent fields.
您可以连接 nameof
就像这样:
nameof(MyModelType.EmbeddedObject) + "." + nameof(MyModel.EmbeddedObject.Id)
产生EmbeddedObject.Id
如nameof
总是会产生表达式链的最后一段。只需将每个表达式深挖一层即可构建字符串。
您也可以编写一个 LINQ 表达式助手:
public static string GetFullPropertyPath<TModel,TProp>(Expression<Func<TModel,TProp>> expr)
{
return String.Join(".", GetMemberList(expr.Body as MemberExpression));
}
public static List<string> GetMemberList(MemberExpression expression)
{
var result = new List<string>();
if (expression.Expression is MemberExpression memberExpression)
{
result.AddRange(GetMemberList(memberExpression));
}
result.Add(expression.Member.Name);
return result;
}
GetMemberList
返回选定的成员链,不带参数。因此,如果您提供诸如 m => m.EmbeddedObject.Id
之类的表达式它将返回[ "EmbeddedObject", "Id" ]
当与 .
结合时产量EmbeddedObject.Id
.
GetFullPropertyPath
仅返回用 .
连接的表达式中的成员列表。特点。 Here是一个在线演示,稍作修改,因为它不允许 is MemberExpression memberExpression
语法。
作为旁注,我还建议尝试 FluentValidation library ,尽管产生的结构验证响应略有不同,但在我看来,它比内置属性验证更加通用。
关于asp.net - 生成 ModelState 字典的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53494932/