asp.net - 生成 ModelState 字典的键

标签 asp.net asp.net-core .net-core asp.net-core-2.1 .net-core-2.1

据我了解,.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.Idnameof总是会产生表达式链的最后一段。只需将每个表达式深挖一层即可构建字符串。

您也可以编写一个 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/

相关文章:

c# - 如何在 asp.net core 中使用 RestSharp.NetCore

.net-core - Azure Pipeline 中的 .Net Core、Visual Studio 构建和 MSBuild 任务之间的区别?

asp.net - 使用 ASP.NET AJAX/ICallbackEventHandler 跟踪状态

c# - 如何集成 Expression<Func<>> 来清理我的 Linq-to-Entity 查询?

c# - Asp.Net Core 是否跨请求保留 CallContext?

c# - asp.net core 在上一个操作完成之前在此上下文中开始第二个操作

c# - 尝试路由到特定 URL 时找不到目录错误

.net - 我应该为一个独立的 ASP.NET Web 应用程序使用多个程序集吗?

asp.net-core - 类库中 .NET Core 中的依赖注入(inject)

.net-core - .Net Core Npgsql 准备语句