美文网首页Asp.net开发.netasp.net
基于 HtmlHelper 的自定义扩展Container

基于 HtmlHelper 的自定义扩展Container

作者: 天天向上卡索 | 来源:发表于2017-08-07 09:51 被阅读88次

基于 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

相关文章

网友评论

    本文标题:基于 HtmlHelper 的自定义扩展Container

    本文链接:https://www.haomeiwen.com/subject/xcyolxtx.html