【问题标题】:How to set Max Depth for specific class in a controller?如何为控制器中的特定类设置最大深度?
【发布时间】:2020-07-17 20:11:39
【问题描述】:

我需要一个如下所示的模型,并且我需要 Category.MySegments 的 MaxDepth 为 3。我不需要在应用程序级别或控制器级别上指定 MaxDepth 设置,而是只需要这个类。 该怎么做?

public class Category
{
    .
    .
    public List<Segment> MySegments{ get; set; }
    .
    .
}

public class Segment
{
    public string SegmentName { get; set; }
    public string GroupBy { get; set; }
    public List<Segment> InnerSegments { get; set; }
}

提前致谢。

【问题讨论】:

  • 在Category Class中创建一个只读字段
  • 我希望用户添加直到 MaxDepth 为 3。我在控制器中收到此请求正文。
  • 那么你需要在类中有一个属性,并从用户输入中为其赋值,然后用它来填充子对象。

标签: c# asp.net-mvc controller


【解决方案1】:

您可以使用这样的递归方法来验证模型:

private bool ExceedsDepth(Segment segment, int depth)
{
    if (depth == 1)
    {
        // max valid depth reached - return true if childs present, otherwise false
        return segment.InnerSegments != null && (segment.InnerSegments == null || segment.InnerSegments.Any());
    }

    // max depth not yet reached
    if (segment.InnerSegments == null ||
        segment.InnerSegments != null && !segment.InnerSegments.Any())
    {
        // element at depth has no child segments
        return false;
    }

    return segment.InnerSegments.Any(x=> ExceedsDepth(x, depth-1));
}

在验证器中的使用:

var exceeded = mySegments.Any(x => ExceedsDepth(x, 3));

编辑:我不确定我是否正确。您想只接受 maxDepth 为 3 的请求,还是想接受每个请求并在之后“切断”更深的嵌套段?

更新:之后使用:

private Segment CutAtDepth(Segment segment, int depth)
{
    if (depth == 0)
    {
        // max valid depth reached
        if (segment.InnerSegments != null && segment.InnerSegments.Any())
        {
            // element at max depth has child segments
            segment.InnerSegments.Clear();
        }

        return segment;
    }

    segment.InnerSegments = segment.InnerSegments.Select(x=> CutAtDepth(x, depth - 1)).ToList();
    return segment;
}

用法:

var limitedDepthObj = mySegments.Select(x=> CutAtDepth(x, 3));

【讨论】:

  • 我想接受每个请求,然后“切断”更深的嵌套段。
  • 更新了答案。现在你有两种选择了。
  • 我可以这样做,因为MaxDepth has a limit 我不必担心大型嵌套请求。我担心性能,这应该没问题。
猜你喜欢
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多