您的位置:首页 > Web前端 > HTML

基于 HtmlHelper 的自定义扩展Container

2017-08-07 09:59 435 查看

基于 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: