• 基于 HtmlHelper 的自定义扩展Container


    基于 HtmlHelper 的自定义扩展Container

    Intro

    基于 asp.net mvc 的权限控制系统的一部分,适用于对UI层数据呈现的控制,基于 HtmlHelper 的扩展组件

    Code

    基于 asp.net mvc 的权限控制系统示例代码:https://github.com/WeihanLi/AccessControlDemo

    权限控制核心代码:https://github.com/WeihanLi/AccessControlDemo/tree/master/AccessControlHelper

    SparkContainer 代码:

     1 public class SparkContainer : IDisposable
     2     {
     3         private readonly string _tagName;
     4         private readonly ViewContext _viewContext;
     5         private readonly bool _canAccess;
     6         private bool _disposed;
     7 
     8         private readonly string _content;
     9 
    10         public SparkContainer(ViewContext viewContext, string tagName, bool canAccess = true)
    11         {
    12             _viewContext = viewContext;
    13             _tagName = tagName;
    14             _canAccess = canAccess;
    15             if (!_canAccess)
    16             {
    17                 _content = (_viewContext.Writer as StringWriter).GetStringBuilder().ToString();
    18             }
    19         }
    20 
    21         public void Dispose()
    22         {
    23             Dispose(true);
    24             GC.SuppressFinalize(this);
    25         }
    26 
    27         protected virtual void Dispose(bool disposing)
    28         {
    29             if (!_disposed)
    30             {
    31                 _disposed = true;
    32                 EndShopContainer();
    33             }
    34         }
    35 
    36         public void EndShopContainer()
    37         {
    38             if (!_canAccess)
    39             {
    40                 (_viewContext.Writer as StringWriter).GetStringBuilder().Clear().Append(_content);
    41             }
    42             else
    43             {
    44                 _viewContext.Writer.Write("</{0}>", _tagName);
    45             }
    46         }
    47     }

    扩展方法

     /// <summary>
            /// SparkContainer
            /// </summary>
            /// <param name="helper">HtmlHelper</param>
            /// <param name="tagName">标签名称</param>
            /// <param name="attributes">htmlAttributes</param>
            /// <param name="accessKey">accessKey</param>
            /// <returns></returns>
            public static SparkContainer SparkContainer(this HtmlHelper helper, string tagName, object attributes = null, string accessKey = "")
            {
                // ...
                return SparkContainerHelper(helper, tagName, HtmlHelper.AnonymousObjectToHtmlAttributes(attributes), displayStrategy.IsControlCanAccess(accessKey));
            }
    
            private static SparkContainer SparkContainerHelper(this HtmlHelper helper, string tagName,
                IDictionary<string, object> attributes = null, bool canAccess = true)
            {
                // ...
                TagBuilder tagBuilder = new TagBuilder(tagName);
                if (canAccess)
                {
                    tagBuilder.MergeAttributes(attributes);
                    helper.ViewContext.Writer.Write(tagBuilder.ToString(TagRenderMode.StartTag));
                }
                return new SparkContainer(helper.ViewContext, tagName, canAccess);
            }

    Use

    使用说明:

    @using(Html.SparkContainer("div",new { @class="container",custom-attribute = "abcd" }))
    {
        @Html.Raw("1234")
    }

    没有权限访问时就不会将内容渲染到页面,有权限访问时实际渲染生成的 Html 如下:

    1 <div class="container" custom-attribute="abcd">
    2     1234
    3 </div>

    Contact

    如果您有什么问题或建议,欢迎与我联系 weihanli@outlook.com

  • 相关阅读:
    Centos下安装部署redis
    mysql 事务操作
    python 基础杂货铺
    6、Django 第三方工具
    5、Django
    4、django 模板
    RPC框架--missian框架
    jvm详情——7、jvm调优基本配置、方案
    jvm详情——6、堆大小设置简单说明
    jvm详情——5、选择合适的垃圾收集算法
  • 原文地址:https://www.cnblogs.com/weihanli/p/CustomContainerBasedonHtmlHelper.html
Copyright © 2020-2023  润新知