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