【问题标题】:Generate the keys for the ModelState dictionary为 ModelState 字典生成键
【发布时间】:2019-04-28 21:56:01
【问题描述】:

据我了解,.NET Core 中的 ModelState 返回如下结构:

{
  "Field1": [ "error1", "error2" ],
  "Field2.NestedField": [ "error1", "error2 ],
  "CollectionField[3]": [ "error1", "error2"]
}

现在,如果我在控制器中进行一些额外的自定义验证(例如,如果 id 引用的实体存在,则进行数据库查询)我需要将键设置为字符串。

我只是不知道如何构建获得这些格式的关键。 这种格式有名字吗?

使用 name of 只会给出字段的名称,而不是父字段的名称。

有没有一种简单的方法来生成这些名称?

【问题讨论】:

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


    【解决方案1】:

    使用 name of 只会给出字段的名称,而不是父字段的名称。

    您可以像这样连接nameofs:

    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 =&gt; m.EmbeddedObject.Id 之类的表达式,它将返回 [ "EmbeddedObject", "Id" ],当与 .s 结合时会产生 EmbeddedObject.Id

    GetFullPropertyPath 仅返回表达式中的成员列表,并以 . 字符连接。 Here 是一个在线演示,稍作修改,因为它不允许 is MemberExpression memberExpression 语法。

    作为旁注,我还建议尝试FluentValidation library,尽管它产生的验证响应结构略有不同,但在我看来,它比内置属性验证更通用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-25
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      相关资源
      最近更新 更多