我正在使用以下代码用数据填充表格。
if
语句无法正常工作。条件块中的两个语句都被执行。
@if (--somecondition--)
{
<table>
foreach (Message userMessage in UserMessages)
{
<tr>
if(@userMessage.Message.MessageText.Length <= 10)
{
<td>
@userMessage.Message.MessageText
</td>
}
if(@userMessage.Message.MessageText.Length > 10)
{
<td>
@userMessage.Message.MessageText.Substring(0, 10)
</td>
}
</tr>
}
</table>
}
我在这里缺少什么? 这样的使用不可能吗?
编辑(看到答案后):
我想 -
在内部代码中,您不需要使用“@”
为“if”构造前缀
答案 0 :(得分:11)
您需要从@
...
@foreach (Message userMessage in UserMessages)
{
和...
@if(userMessage.Message.MessageText.Length <= 10)
{
一开始没有它,if(
仍被视为HTML。
@
符号标识Razor语法的开头(即C#代码),并将继续成为剃刀代码块,直到达到适当的终结符。有很多方法可以将其移回HTML,在您的示例中最常见的方法是包含html标记,例如<td>
。
以下是代码的完整版本,希望它能帮助您了解它的工作原理:
<table>
//due to the table tag, we are current inside HTML
//so we need to use the @ symbol to move back to razor syntax
@foreach (Message userMessage in UserMessages)
{
<tr>
//using this tag again changes us back to HTML mode
//so again we must use the at symbol
@if(userMessage.Message.MessageText.Length <= 10)
{
//still Razor
<td>
//back in HTML mode
@userMessage.Message.MessageText
</td>
}
@if(userMessage.Message.MessageText.Length > 10)
{
<td>
@userMessage.Message.MessageText.Substring(0, 10)
</td>
}
</tr>
}
</table>
(我知道这些评论在Razor中不起作用所以不要添加它们)
清理你最初的想法。如果您没有第一个<tr>
标记,则以下内容将有效...
@foreach (Message userMessage in UserMessages)
{
if(userMessage.Message.MessageText.Length <= 10)
{
注意整个if语句行不需要@
符号,因为我们从未移回HTML模式。
答案 1 :(得分:1)
你的代码的问题在于你混淆了什么是HTML和什么是Razor。 @
符号应该是您的Razor代码启动的位置,然后您不需要在Razor代码中使用它。
当您编写if(@userMessage.Message.MessageText.Length <= 10)
时,if
不会被视为Razor代码,而是HTML的一部分。因此,每当您离开HTML并进入Razor模式时,您需要有@
标记。 if
语句应该看起来像@if(userMessage.Message.MessageText.Length <= 10)
。
您的代码的完整示例如下:
<table>
@foreach (Message userMessage in UserMessages)
{
<tr>
@if(userMessage.Message.MessageText.Length <= 10)
{
<td>
@userMessage.Message.MessageText
</td>
}
@if(userMessage.Message.MessageText.Length > 10)
{
<td>
@userMessage.Message.MessageText.Substring(0, 10)
</td>
}
</tr>
</table>