代码之家  ›  专栏  ›  技术社区  ›  monty

生成modelstate字典的键

  •  2
  • monty  · 技术社区  · 7 年前

    据我所知,.net core中的modelstate返回如下结构:

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

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

    我只是不知道如何构建密钥来获得这些格式。 这种格式有名字吗?

    使用name of只提供字段的名称,而不提供父字段的名称。

    有没有一种简单的方法来产生这些名字?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Balázs    7 年前

    使用name of只提供字段的名称,而不提供父字段的名称。

    您可以将 nameof 像这样:

    nameof(MyModelType.EmbeddedObject) + "." + nameof(MyModel.EmbeddedObject.Id)
    

    其产量 EmbeddedObject.Id 作为 名字 将始终生成表达式链的最后一段。只需通过对每个表达式深入挖掘一个级别来构建字符串。

    您也可以编写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" ] 当与 . S产量 嵌入对象.id .

    这个 GetFullPropertyPath 只返回表达式中与 . 性格。 Here 是一个在线演示略有修改,因为它不允许 is MemberExpression memberExpression 语法。

    另外,我也建议你试试 FluentValidation library ,虽然它产生的结构验证响应稍有不同,但在我看来,它比内置的属性验证功能要多得多。

    推荐文章