加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

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

发布时间:2020-12-14 18:57:17 所属栏目:资源 来源:网络整理
导读:在剃刀中,有一个好奇的规则,只允许在if块中封闭 HTML. 看到: Razor doesn’t understand unclosed html tags 但我有一种情况,我想在某些条件下排除一些外部的包装元素.我不想重复所有内部的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相同的模式. (免责声明:此代码未经全面测试,但提供了如何工作的想法,您可以接受属性,标签名称等额外参数).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读