剃刀语法 – 如何有条件地包装一些内部HTML

前端之家收集整理的这篇文章主要介绍了剃刀语法 – 如何有条件地包装一些内部HTML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在剃刀中,有一个好奇的规则,只允许在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相同的模式. (免责声明:此代码未经全面测试,但提供了如何工作的想法,您可以接受属性,标签名称等额外参数).

猜你在找的HTML相关文章