Razor不理解unclosed html标签

时间:2011-01-26 20:29:51

标签: asp.net-mvc-3 razor

使用RazorViewEngine,我可以这样做:

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

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

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

我有一种情况需要将我的开始和结束html标签放在不同的代码块中 - 我怎样才能在Razor中执行此操作?

4 个答案:

答案 0 :(得分:157)

试试这样:

if (somecondition) {
    @:<div>
}

答案 1 :(得分:56)

解释Darin的答案,即为HTML加上这样的前缀:

@:<html>

@:在Razor中意味着“将内容呈现为纯文本”

或者您可以使用它,它会在您原始编写时输出HTML(这也可以用来避免Razor在您尝试输出HTML时执行的自动HTML编码):

@Html.Raw("<html>")

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

答案 2 :(得分:4)

您可以创建自定义MVC Helper方法。为此,您可以在命名空间System.Web.Mvc.Html中创建公共静态类MyRenderHelpers并编写方法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 :(得分:3)

您必须执行此操作通常表示您的视图代码未正确分解。 HTML的本质是拥有平衡或自封闭的标签(至少在HTML 4中,HTML 5似乎倾向于它),Razor依赖于这个假设。如果你有条件地ouptut <div>,那么你也会在某个地方输出</div>。只需将问题对放在if语句中:

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

否则,您最终会得到奇怪的代码,例如here