C# 剃刀为什么不喜欢这个?

C# 剃刀为什么不喜欢这个?,c#,asp.net-mvc-3,razor,C#,Asp.net Mvc 3,Razor,我有一个非常恼人的问题,我有一个观点: @{ if(ViewBag.Section == "Home") { <div id="headerfrontPage"> } else { <div id="header"> } } @{ 如果(ViewBag.Section==“主页”) { } 其他的 {

我有一个非常恼人的问题,我有一个观点:

@{

        if(ViewBag.Section == "Home")
        {
           <div id="headerfrontPage">   
        }
        else
        {
            <div id="header">   
        }


     }
@{
如果(ViewBag.Section==“主页”)
{
}
其他的
{
}
}
我得到一个编译错误:

代码块缺少结束“}”字符。确保你有 此块中所有“{”字符的匹配“}”字符, 并且没有任何“}”字符被解释为标记

如何有条件地编写div?基本上是为了黑客…

试试这个:

@if (ViewBag.Section == "Home")
{
    <text> <div id="headerfrontPage"> </text>
}
else
{
    <text> <div id="header"> </text>
}
@if(ViewBag.Section==“Home”)
{
}
其他的
{
}

我怀疑这是因为您的div没有关闭,所以razor假设右括号实际上是div内容的一部分

您可以尝试在那里输出代码中的整个div内容,包括结束标记,或者输出带有Response.Write或类似内容的div标记,这样就不会出现混淆的标记

编辑:也可以将您的div标记包含在

<text></text>

可能值得一试。

您可以尝试以下方法:

@{
string divName;

    if(ViewBag.Section == "Home")
    {
       divName = "headerfrontPage";
    }
    else
    {
        divName = "header";
    }
}

<div id="@divName"> 
@{
字符串divName;
如果(ViewBag.Section==“主页”)
{
divName=“headerfrontPage”;
}
其他的
{
divName=“header”;
}
}

我不确定这是否会有帮助,这是一个漫长的过程。但至少看起来更好…

当您包装div的内部元素时,可以使用相同的构造,如:

@if (ViewBag.Section == "Home")
{
    <text><div id="headerfrontPage"></text>
}
else
{
    <text><div id="header"></text>
}
@if(ViewBag.Section==“Home”)
{
}
其他的
{
}
或者你使用剃刀语法@:比如

@if (ViewBag.Section == "Home")
{
    @:<div id="headerfrontPage">
}
else
{
    @:<div id="header">
}
@if(ViewBag.Section==“Home”)
{
@:
}
其他的
{
@:
}
但就您目前的情况而言,我更喜欢罗恩·西姆的解决方案:

@{
var divName = ViewBag.Section == "Home" ? "headerfrontPage" : "header";
}

<div id="@divName"> 
@{
var divName=ViewBag.Section==“主页”?“headerfrontPage”:“页眉”;
}

写这篇文章最简单的方法是:

<div id="@(ViewBag.Section == "Home" ? "headerFrontPage" : "header")">

或者,如果愿意,可以使用局部变量:

@{ var headerID = ViewBag.Section == "Home" ? "headerFrontPage" : "header"; }

<div id="@headerID">
@{var headerID=ViewBag.Section==“主页”?“headerFrontPage”:“页眉”}
关于Razor代码块中未闭合标记的更一般情况,您可以:

@if(ViewBag.Section==“Home”)
{
@:
}
其他的
{
@:
}

仍然会遇到同样的问题:-(Exitos正确地使用了周围的代码块,尽管这是不必要的。这个答案只是删除了该代码块,并不能解决问题。+1因为我喜欢这种选择属性值的方式,而不是使用的方式。Razor解析器在代码和html之间的转换方面非常严格。因为它完全理解这两种方式您必须通过转换为html而不关闭块来正确打开/关闭元素,这会告诉解析器您仍然在html中,因此它会忽略}。最干净的方法是
@:
,它只将您开始的行转换为html转换。
不太清晰,我不建议这样做.我同意BuildStarted和Andrew Barber的回答,但我还需要注意的是,我建议单独计算类名,并将其存储在“headerClass”之类的变量中,然后再进行编写。这是一个非常恼人的问题,似乎没有任何方法告诉Razor“已经关闭该死的块了”。如果你只有1或2行要转义,那么这个问题的答案就可以了,但我有15/20行,我不想全部转义!第一种语法肯定是我首选的方式。我认为这是一个相对较新的Razor添加(可能在MVC3附带的Razor版本中不可用?)@AndrewBarber这是可能的!我认为表达式语法已经存在了一段时间了-[Scott Gu在2010年提到过][我记得去年使用过它,但以防万一,三元语法也应该适用于
Html。Raw
:)中间部分对我来说非常有效。超级简单,希望我能早点解决这个问题。。。
@if (ViewBag.Section == "Home")
{
    @:<div id="headerFrontPage">
}
else
{
    @:<div id="header">
}