循环调用函数调用SQL过程,但结果不显示在HTML中

时间:2015-05-27 20:32:12

标签: c# html razor

我遇到了一个奇怪的C#/ HTML问题。我有一个CSHTML文件,其中包含以下代码。在某些生产站点(但不是全部),它似乎没有经过循环。查看HTML,列表中没有项目。我的第一个冲动是ListTags没有被调用,但是嗅探SQL事务表明它调用了SQL函数,我可以在数据库上运行该函数并验证我得到了正确的值。我唯一的想法是,由于某种原因,第一个Razor代码部分中的语句并非都被调用,因为count永远不会被设置为高于0,但这似乎不太可能。

<div>
    @{ List<String> stringList = Helper.ListTags(); int count = stringList.Count; int COL_WIDTH = 5;}
    <table style="width:100%">
        @for (int i = 0; i < count / COL_WIDTH; ++i)
        {
            <tr>
            @for (int j = 0; j < COL_WIDTH && i + j < count; ++j)
            {
                string tag = stringList[i * COL_WIDTH + j];
                string @tagId = "tag" + tag;
                <td>
                    <input type="checkbox" value=@tag id=@tagId onclick='checkboxSelected(this)' />@tag
                </td>
            }
            </tr>
        }
    </table>
</div>

任何人都知道可能导致这种情况的原因是什么?

在相关服务器上表达的HTML是:

<div>
    <table style="width:100%">
    </table>
</div>

如您所见,没有<TR><TD><INPUT>元素。

1 个答案:

答案 0 :(得分:3)

我认为如果你的ListTags()方法返回的结果少于COL_WIDTH,那么你的第一个@for循环中的条件将在第一次测试时失败。

Say ListTags()返回4个条目。计数将为4.当i < count / COL_WIDTH返回false时,count / COL_WIDTH表达式将返回0

因此外循环永远不会执行。

尝试i **&lt; = ** count / COL_WIDTH

@for (int i = 0; i <= count / COL_WIDTH; ++i)

此外,我认为你的第二个循环中的条件不正确。

而不是j < COL_WIDTH && i + j < count,请考虑

j < COL_WIDTH && ((i*COL_WIDTH + j) < count)

想象一下,ListTags()返回7个项目,COL_WIDTH仍为5.

当i == 1渲染第二行时,你想要在第二个项目之后停止j循环。您的表达式不会停留在j == 2,因为您正在评估(2 < 5) && (3 < count)并不是真的。

当您评估(2 < 5) && (1*5 + 2 < count)时,使用修订后的表达式会在i == 1和j == 2时停止,这是假的。