HTML Razor if语句不起作用

时间:2015-08-04 19:34:38

标签: c# asp.net-mvc asp.net-mvc-4 razor visual-studio-2013

我正在使用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语句是问题,所以这只是尝试修复它,没有用。

3 个答案:

答案 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>
}