微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

剃刀语法 – 如何有条件地包装一些内部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相同的模式. (免责声明:此代码未经全面测试,但提供了如何工作的想法,您可以接受属性,标签名称等额外参数).

原文地址:https://www.jb51.cc/html/224701.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐