我的一个视图中有一段Razor代码,表现不像我期望的那样。有问题的代码包含多个位置,我需要将Model中的变量值附加到html属性上。下面的代码是我页面上标记的略微简化版本(我删除了一些标记'噪音',这对于这个例子并不重要,只是让代码更难阅读)。
我使用@topic.StandardTopicId
有三个实例。第一个和第二个实例按照我的预期被替换,但第三个实例name="IsCovered_@topic.StandardTopicId"
呈现而不替换变量。
有问题的代码:
@foreach(var topic in Model.Group) {
<div id="frame-@topic.StandardTopicId" class="topic-frame">
<label>
<input type="radio" name="IsCovered_@(topic.StandardTopicId)" />
No
</label>
<label>
<input type="radio" name="IsCovered_@topic.StandardTopicId" />
Yes
</label>
</div>
}
上述代码块的输出示例:
...
<div id="frame-42" class="topic-frame">
<label>
<input type="radio" name="IsCovered_42" />
No
</label>
<label>
<input type="radio" name="IsCovered_@topic.StandardTopicId" value="No" />
Yes
</label>
</div>
...
有人可以解释为什么变量的最后一个实例没有被替换,而是被渲染为原样吗?
答案 0 :(得分:6)
Razor不会在一个单词的中间解析“@”。下划线被视为单词的一部分而不是短划线。使用@()将Razor代码放在单词中。 @(topic.StandardTopicId)
答案 1 :(得分:5)
这里提到了Razor语法:C# Razor Syntax Quick Reference
最有可能的是,Razor认为IsCovered_@topic.StandardTopicId
是一种有效的电子邮件地址格式,因此保持原样。