我遇到了一个奇怪的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>
元素。
答案 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时停止,这是假的。