剃刀不理解未封闭的html标签


99

使用RazorViewEngine,我可以做到这一点:

if (somecondition) {
     <div> some stuff </div>
}

但我似乎无法做到这一点(Razor感到困惑):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

我遇到需要将打开和关闭html标签放在不同代码块中的情况-如何在Razor中做到这一点?

Answers:


161

尝试这样:

if (somecondition) {
    @:<div>
}

1
或者<text><div></text>- haacked.com/archive/2011/01/06/...
Simon_Weaver

17
<text><div></text>有效,但<text></div></text>无效。
13年

@Stuntman,您需要同时对开始和结束标记执行此操作。
Departamento B

以及如何处理多行文字?
Dmitri Tsoy

我无法内联执行此操作。if(condition){@:tag}。我不得不像上面一样格式化它。
迈克(Mike)

59

为了解释达林的答案,即像这样在HTML前面加上前缀:

@:<html>

@:在Razor中的意思是“将某些内容渲染为纯文本”

或者,您也可以使用它,它在您最初编写HTML时就输出HTML(也可以用来避免Razor在尝试输出HTML时进行自动HTML编码):

@Html.Raw("<html>")

(来自MS的HTML.Raw参考-http: //msdn.microsoft.com/zh-cn/library/gg568896 (v=vs.111 ) .aspx


2
解决方案很棒,但是解释是无价的。谢谢!
jay

2
我更喜欢@ Html.Raw(“ <html>”)解决方案,因为在使用自动格式设置(ctrl + K ctrl + D)时,第一个拆分在多行上
Matteo Sganzetta

@MatteoSganzetta为真,除非您输出的是Razor变量,例如:@:<a href="@link" class="@classNames">@text</a>
qJake

使用时要小心@Html.Raw()- 请参阅相关的SO帖子
SliverNinja-MSFT,

4

您可以创建一个自定义的MVC Helper方法。为此,您可以在名称空间中创建公共静态类MyRenderHelpers System.Web.Mvc.Html并编写方法Html。

namespace System.Web.Mvc.Html
{
    public static class MyRenderHelpers
    {
        public static MvcHtmlString Html(this HtmlHelper helper, string html, bool condition)
        {
            if (condition)
                return MvcHtmlString.Create(html);
            else
                return MvcHtmlString.Empty;
        }
    }
}

现在,您可以在剃刀视图中使用此扩展方法:

@Html.Html("<div>", somecondition)

3

您必须这样做的事实通常表明您的视图代码未正确分解。HTML的本质是具有平衡的或自封闭的标签(至少在HTML 4中,HTML 5似乎远离它了),而Razor依赖于这种假设。如果您要有条件地输入a,<div>那么您还将在以后的某个地方输出</div>。只需在您的if陈述中添加一对即可:

@if(something) {
    <div>
        Other stuff
    </div>
}

否则,您将得到像这里这样的怪异代码。


6
我的情况是我想要
sydneyos 2011年

是的,我的意思是在99%的情况下您可能不应该这样做。但你可能会适应这个1%,在这种情况下,有@:<text></text>
marcind

7
他稍后可能会遇到一个封闭式障碍:if (somecondition) { @:</div> }
Simon_Weaver

是的,他必须这样做。我的观点是可以重构这样的视图,这样就不需要这样的双重条件了。
2011年

1
@michielvoo例如,为什么使用此方法具有条件div包装器会很糟糕?同样在HTML5中,您不会关闭<link>标签。
克里斯·海恩斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.