基于 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
如果您有什么问题或建议,欢迎与我联系 [email protected]
时间: 2024-10-11 02:49:54