Razor内联代码生成编译器错误

时间:2014-01-29 16:00:54

标签: asp.net-mvc-4 razor

我正在尝试使用KendoGrid内容模板和内联Razor动态设置单元格的内容,但我遇到了各种错误。

"<table><tr>" + 
"<td style='color:yellow; width:200px;height:13px;padding-top:0px; margin-top:0px;text-align:center;' class='audiogrid'>" +
@{
   @if ((int)TempData["MediaTypeId"] == 1) { 
      @"<audio id='a1' src='#: MediaLocation #' controls='controls' preload='auto' autobuffer><embed height='26' autostart = 'false' type = 'audio/mpeg' width='290' src='#: MediaLocation #'></audio>" +
   }
   else{
     @"&nbsp; #: Description # " +
   }
}
"</td>" +
"</tr></table>"

上面的代码抛出一个错误:CS1646:在逐字说明符之后预期的关键字,标识符或字符串:@在@符号的第一个实例。

我不明白为什么或这个错误意味着什么。根据在MVC4中使用Razor的规则,我的语法应该有效。做了一点研究,确保语法准确here 但我尝试了一个变体,其中包含@之后的字符串作为错误建议并且我认为应该也可以正常工作:

"<table><tr>" + 
"<td style='color:yellow; width:200px;height:13px;padding-top:0px; margin-top:0px;text-align:center;' class='audiogrid'>" +
@if ((int)TempData["MediaTypeId"] == 1) { 
    @"<audio id='a1' src='#: MediaLocation #' controls='controls' preload='auto' autobuffer><embed height='26' autostart = 'false' type = 'audio/mpeg' width='290' src='#: MediaLocation #'></audio>" +
    }
    else{
          @"&nbsp; #: Description # " +
    }
"</td>" +
"</tr></table>" 

这次我得到编译器错误消息:CS1026 :)预期在我的代码中出现@ first的同一行。

我也尝试了其他一些变化,但它们似乎都没有效果。 我在这里做错了什么或错过了什么? : - (

基本上,单元格中的控件应根据介质类型进行更改。

1 个答案:

答案 0 :(得分:1)

Razor不是某种字符串连接语法。您指定html标记和C#代码,Razor引擎将它们写入客户端。

@{块(或任何其他代码块)中,您可以使用C#语句。没有必要额外的@。

@if(或任何其他代码块)中,您可以使用html标记。无需在@。

之前添加它们

else块内,使用@:输出不带html标记的html。

<table><tr>
<td style='color:yellow; width:200px;height:13px;padding-top:0px; margin-top:0px;text-align:center;' class='audiogrid'>
@{
   if ((int)TempData["MediaTypeId"] == 1) { 
      <audio id='a1' src='#: MediaLocation #' controls='controls' preload='auto' autobuffer><embed height='26' autostart = 'false' type = 'audio/mpeg' width='290' src='#: MediaLocation #'></audio>
   }
   else{
      <text>&nbsp; #: Description # </text>
   }
}