在剃刀中,有一个好奇的规则,只允许在if块中封闭
HTML.
看到:
Razor doesn’t understand unclosed html tags
但我有一种情况,我想在某些条件下排除一些外部的包装元素.我不想重复所有内部的HTML,这是相当多的HTML和逻辑.
没有任何其他重新使用这个新的部分,它感觉真的很尴尬,脓肿.我想知道这个规则是否是剃刀的限制,或者只是一个纳闷(烦人的)功能.
解决方法
你可以使用Html.Raw(mystring).在myString中,您可以写任何所需的内容,例如标签打开或关闭,而不会出现任何错误.即
if (condition) { @Html.Raw("<div>") } if (condition) { @Html.Raw("</div>") }
注意:@ Html.Raw(“< div>”)可以使用较短的替代形式,如下所示:@:< div>
您也可以使用create your own html helpers来简化剃刀语法.这些帮助者可以接收条件参数,以便您可以执行以下操作:
@Html.DivOpen(condition) @Html.DivClose(condition)
也不是Raw,html帮助者都不会被检测为“标签”,以便您可以自由使用它们.
做最好的方法
实现类似BeginForm html帮助器的安全性会更加安全.你可以看源码.它很容易实现:您只需要在构造函数中写入开始标签,并在Dispose方法中写入结束标签.这种技术的优点是您不会忘记关闭有条件打开的标签.
您需要实现此html帮助程序(在静态类中声明的扩展方法):
public static ConditionalDiv BeginConditionalDiv(this HtmlHelper html,bool condition) { ConditionalDiv cd = new ConditionalDiv(html,condition); if (condition) { cd.WriteStart(); } return cd; // The disposing will conditionally call the WriteEnd() }
其中使用了这样一个类:
public class ConditionalDiv : IDisposable { private HtmlHelper Html; private bool _disposed; private TagBuilder Div; private bool Condition; public ConditionalDiv(HtmlHelper html,bool condition) { Html = html; Condition = condition; Div = new TagBuilder("div"); } public void Dispose() { Dispose(true /* disposing */); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!_disposed) { _disposed = true; if (Condition) { WriteEnd(); } } } public void WriteStart() { Html.ViewContext.Writer.Write(Div.ToString(TagRenderMode.StartTag)); } private void WriteEnd() { Html.ViewContext.Writer.Write(Div.ToString(TagRenderMode.EndTag)); } }
您可以使用与BeginForm相同的模式. (免责声明:此代码未经全面测试,但提供了如何工作的想法,您可以接受属性,标签名称等额外参数).