我正在使用Razor语法在cshtml文件中使用表格创建给定月份的日历。我有以下代码片段作为其中的一部分:
@for(int i = 1; i < ViewBag.numdays; i++)
{
if(true)
{
<td>@i</td>
}
if(ViewBag.col == 6)
{
</tr><tr>
}
if(ViewBag.col == 6)
{
ViewBag.col = 0;
}
else
{
ViewBag.col++;
}
}
(注意我在调试时检查了两个ViewBag变量是否具有有效的int值,并且它们在程序的其他地方工作)
此代码构建没有任何错误。但是,当我实际运行它时,它会在浏览器中崩溃。它将包含for语句的行放在发生错误的位置,并说 for block缺少关闭&#34;}&#34;字符。确保你有匹配的&#34;}&#34;所有&#34; {&#34;这个区块内的字符,并没有&#34;}&#34;字符被解释为标记。我还注意到在Visual Studio中,当光标位于左括号旁边时,它通常会突出显示右括号,但它不会为循环执行此操作。此外,除了第一个之外,它也不会对内部的任何if语句执行此操作(我不是要突出显示错误的括号,它不会突出显示任何内容)。我真的不知道我在这里做错了什么,任何帮助都会非常感激。感谢。
编辑:我刚刚意识到if(true)
可能看起来很奇怪,起初我想也许只是在其中创建HTML行,然后使用if语句是问题,所以这只是尝试修复它,没有用。
答案 0 :(得分:3)
据我所知,这就是行
</tr><tr>
这就是把它扔掉 - 可能因为它不是有效的HTML。尝试用
替换该行@:</tr><tr>
它应该可以正常工作。但是,您的代码也在线上产生错误:
ViewBag.col++;
我相信您必须在剃刀中创建一个局部变量来处理该列,因为您无法在ViewBag中增加动态变量。
答案 1 :(得分:0)
您收到该错误是因为ASP.NET的Razor引擎不允许您拆分HTML标记。每个“块”必须包含格式良好的HTML。因此,这是您的问题部分,因为您已打开<tr>
但未在该块中关闭它:
if(ViewBag.col == 6)
{
</tr><tr>
}
你需要考虑一种完全不同的方法。我会先尝试找出number of weeks in the month。循环遍历这些,在开头打开<tr>
并在结束时关闭它。希望这对你来说已经足够了(对不起,此刻有点太忙了,不能给你更完整的东西)。
@for (int i = 0; i < weeksInMonth; i++)
{
<tr>
@* do stuff here *@
</tr>
}
答案 2 :(得分:0)
我意识到我在这里参加聚会有点晚了,但我想对这个问题留下完整的答案。请保持温和,因为这是我在本网站上的第一篇文章。当然,建设性的批评受到欢迎。
在构建日历时,我遇到了与无法匹配的大括号相同的问题。
这里的关键是&#39; howcheng&#39;提到:ASP.NET的Razor引擎不会让你像这样拆分你的HTML标签。每个&#34;块&#34;必须包含格式良好的HTML。该问题的解决方案是使用:@:as&#39; john&#39;已经指出了。 ScottGu的博客说:
使用@:明确指出内容的开始
并非所有内容容器块都以标记元素标记开头,并且有些情况下Razor解析器无法隐式检测内容块。
Razor通过使用代码块中的@:字符序列显式指示内容行的开头来解决此问题。 @:序列表示后面的内容行应被视为内容块。
这是我解决问题的方法。它不完整,因为它需要清理但它确实有效。我没有计算周数,但是在这些日子里没有计算:
@using (Html.BeginForm())
{
<table class='calendar'>
<tr><td class='calMthName' colspan='7'> @Model.MonthName, @Model.Year </td></tr>
<tr>
<th class='calDOW'>Sunday</th>
<th class='calDOW'>Monday</th>
<th class='calDOW'>Tuesday</th>
<th class='calDOW'>Wednesday</th>
<th class='calDOW'>Thursday</th>
<th class='calDOW'>Friday</th>
<th class='calDOW'>Saturday</th>
</tr>
@for (DateTime today = Model.BegDate; today <= Model.EndDate; today = today.AddDays(1))
{
var dow = today.DayOfWeek;
Int32 nbrDow = Convert.ToInt32(today.DayOfWeek.ToString("d"));
if (dow == DayOfWeek.Sunday || today == Model.BegDate)
{
@:<tr class='calRow'>
}
if (today == Model.BegDate && nbrDow != 0)
{
for (Int32 idx = 0; idx < nbrDow; idx++)
{
<td class='calNonDay'> </td>
}
}
String style = today == Model.SelectedDate ? "calDaySelected" : "";
<td class='calDay @style'>
<div class='calDayTitle'> @today.Day.ToString() </div>
</td>
if (today == Model.EndDate && nbrDow != 6)
{
for (Int32 idx = nbrDow; idx < 6; idx++)
{
<td class='calNonDay'> </td>
}
}
if (dow == DayOfWeek.Saturday || today == Model.EndDate)
{
@:</tr>
}
}
</table>
}