基于 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 代码:

    public class SparkContainer : IDisposable
    {
        private readonly string _tagName;
        private readonly ViewContext _viewContext;
        private readonly bool _canAccess;
        private bool _disposed;

        private readonly string _content;

        public SparkContainer(ViewContext viewContext, string tagName, bool canAccess = true)
        {
            _viewContext = viewContext;
            _tagName = tagName;
            _canAccess = canAccess;
            if (!_canAccess)
            {
                _content = (_viewContext.Writer as StringWriter).GetStringBuilder().ToString();
            }
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                _disposed = true;
                EndShopContainer();
            }
        }

        public void EndShopContainer()
        {
            if (!_canAccess)
            {
                (_viewContext.Writer as StringWriter).GetStringBuilder().Clear().Append(_content);
            }
            else
            {
                _viewContext.Writer.Write("</{0}>", _tagName);
            }
        }
    }

扩展方法

        /// <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 如下:

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

Contact

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,034评论 25 709
  • 随着银监会要求下调银行理财收益,市面上1个月利率的理财产品,陆续从原来9%速降到6%。银监会强制要求下,所有理财利...
    CBE教育联盟阅读 333评论 0 1
  • 1、上午听李宁老师的网课,边听边佩服这样一位老师,学习那么勤奋那么不要命,悟到如果一个人很专心在一件事情上的时候是...
    如水的日记阅读 331评论 0 0
  • 这一生,太长了。 这是我最近才有的感受,以前总说时间如白驹过隙,一晃而过。现在倒觉得真能一晃而过就好了。前两天看朋...
    wuli丰丰阅读 260评论 0 0
  • 最近由于要解决一个问题,需要用到之前使用不多的python和完全不熟悉的Tensorflow,因此踩坑比较多,解决...
    刘头人阅读 460评论 0 0

友情链接更多精彩内容