基于 HtmlHelper 的自定义扩展Container

2018-06-22 06:13:41来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:使用ClaimsIdentity来实现登录授权

下一篇:nopCommerce 3.9 大波浪系列 之 NUnit 配置调试环境