MVC Razor @helper函数无法正确递归?

时间:2015-12-03 14:14:51

标签: asp.net-mvc asp.net-mvc-4 razor recursion

我的视图模型包含一个我需要迭代的对象,并为每个属性显示一些HTML(我正在为用户创建一种使用@Model语法编译razor消息的方法)。仅当属性具有必要属性(此部分工作)时,才会显示这些属性。但是,递归似乎没有按预期发生。

在调试和步入递归调用时,我看到应该递归到的字段是,但跳过了调用函数。也就是说,在显示当前正在执行的代码行的指针之后,指针直接从打开到关闭括号跳过(使用递归调用的正确参数,请注意),而不会执行任何操作。

@helper OutputProperties(Type type, string path)
{
    <ul>
        @foreach (var info in type.GetProperties())
        {
            var attrib = info.IsDefined(typeof(RazorAccessibleAttribute), false);
            if (attrib)
            {
                <li>
                    @if (@IsTypePrimitive(info.PropertyType))
                    {
                        <a data-value="@(path + "." + info.Name)">@info.Name</a>
                    }
                    else
                    {
                        <a data-value="@(path + "." + info.Name)" href="#">@info.Name</a>
                    }
                </li>
                if (!@IsTypePrimitive(info.PropertyType))
                {
                    OutputProperties(info.PropertyType, path + "." + info.Name);
                }
            }
        }
    </ul>
}

我测试一个简单的递归函数也没什么值得的,这也无法工作。

@helper recurseTest() 
{  
    recurseTest();
}

同样,没有stackoverflow(heh)错误,因为递归从未实际发生过。我用@和没有在电话前测试我的功能(不确定区别是什么)。

1 个答案:

答案 0 :(得分:3)

在方法前面添加“@”应该照顾它......

@OutputProperties(info.PropertyType, path + "." + info.Name);

更新: 完整的测试代码,对原始

进行微小更改
@helper OutputProperties(Type type, string path)
{
    <ul>
        @foreach (var info in type.GetProperties())
        {
            var attrib = true;//info.IsDefined(typeof(RazorAccessibleAttribute), false);
            if (attrib)
            {
                <li>
                    @if (info.PropertyType.IsPrimitive)
                    {
                        <a data-value="@(path + "." + info.Name)">@info.Name</a>
                    }
                    else
                    {
                        <a data-value="@(path + "." + info.Name)" href="#">@info.Name</a>
                    }
                </li>
                    if (!@info.PropertyType.IsPrimitive)
                    {
                        @OutputProperties(info.PropertyType, path + "." + info.Name);
                    }
            }
        }
    </ul>
}

<p>
    @OutputProperties(typeof(MvcTestBench.Models.ManagerUser), "Model")
</p>