【问题标题】:Stuck With ASP.NET MVC Razor Syntax卡在 ASP.NET MVC Razor 语法中
【发布时间】:2011-11-19 17:56:56
【问题描述】:
构建一个快速视图,该视图将显示所有日期的列表,但仅在星期几发生变化时呈现标题。为什么我得到 foreach 的语法错误?任何帮助将不胜感激!
@{
int lastDay = 0;
}
@foreach (var grouping in Model.EventTemplate.EventTemplateSlots) {
if (grouping.Day != lastDay) {
if (lastDay != 0) {
</div>
}
<div style="margin: 5px;"><div class="ui-widget-header ui-corner-all" style="padding: 5px;">@(((DateTime)Model.StartDate).AddDays(grouping.Day).ToShortDateString())</div>
lastDay = grouping.Day;
}
}
【问题讨论】:
标签:
asp.net-mvc
syntax
razor
【解决方案1】:
Razor 不能以这种方式工作。 HTML 元素不能像你拥有的那样分离。你有一个赤裸裸的</div>:
if (lastDay != 0) {
</div>
}
这是无效的,因为 HTML 标记需要与 C# 大括号类似地匹配(它们需要处于同一嵌套级别,并且结束标记不能在词法上出现在开始标记之前)。我不清楚你为什么使用lastDay 检查。为什么不这样写呢?
@foreach (var grouping in Model.EventTemplate.EventTemplateSlots) {
if (grouping.Day != lastDay) {
<div style="margin: 5px;">
<div class="ui-widget-header ui-corner-all" style="padding: 5px;">@(((DateTime)Model.StartDate).AddDays(grouping.Day).ToShortDateString())</div>
</div>
}
}
这样,开始/结束 HTML 标记可以根据需要匹配。
【解决方案2】:
您的模型是否实现了IEnumerable?否则,您将无法在 foreach 循环中对其进行迭代。
您看到的错误是什么?请在您的问题中发布。
【解决方案3】:
这应该可行:
@{
int lastDay = 0;
<div style="margin: 5px;">
@foreach (var grouping in Model.EventTemplateSlots)
{
if (grouping.Day != lastDay)
{
<div class="ui-widget-header ui-corner-all" style="padding: 5px;">
@(((DateTime)Model.StartDate).AddDays(grouping.Day).ToShortDateString())
</div>
lastDay = grouping.Day;
}
}
</div>
}
Razor 更喜欢 HTML 标记正确匹配以解析视图。
另请注意,在您的示例中,如果您的 EventTemplateSlots 集合中没有重复日,您将永远不会获得结束 div 标记。