如何创建像Html.BeginForm这样的Html Helper

时间:2011-11-28 07:08:36

标签: c# asp.net-mvc-3 html-helper

我有一个扩展方法,用于验证用户是否能够根据角色查看网页的一部分。

如果我简单删除内容,这会给我带来更多的工作,因为所有丢失的表单在保存时都无法正确注册,我必须通过修改所有代码来处理这种行为,所以我想为什么不只是使用{{ 1}}属性?

我希望有类似的东西:

display:none;

并且这会写出如下内容:

@using(Html.RoleAccess(currentUser, RoleAccessType.Content_General_Website))
{
    ...
}

如果用户有权访问,请使用<div class="role_Content_General_Website" style="display:none;"> ... </div>

我可以创建一个简单的display:block;但是如何编写一个也输出结尾HtmlHelper

</div>

1 个答案:

答案 0 :(得分:22)

public static class HtmlExtensions
{
    private class RoleContainer : IDisposable
    {
        private readonly TextWriter _writer;
        public RoleContainer(TextWriter writer)
        {
            _writer = writer;
        }

        public void Dispose()
        {
            _writer.Write("</div>");
        }
    }

    public static IDisposable RoleAccess(this HtmlHelper htmlHelper, string role)
    {
        var user = htmlHelper.ViewContext.HttpContext.User;
        var style = "display:none;";
        if (user.IsInRole(role))
        {
            style = "display:block;";
        }
        var writer = htmlHelper.ViewContext.Writer;
        writer.WriteLine("<div class=\"role_Content_General_Website\" style=\"" + style + "\">");
        return new RoleContainer(writer);
    }
}

然后你可以像这样使用它:

@using(Html.RoleAccess("Administrator"))
{
    ...
}

您显然可以调整助手的参数以符合您的要求:

public static IDisposable RoleAccess(
    this HtmlHelper helper, 
    UserInfo user, 
    RoleAccessType role
)
{
    var style = "display:none;";
    if (user.HasAccess(role))
    {
        style = "display:block;";
    }
    var writer = htmlHelper.ViewContext.Writer;
    writer.WriteLine("<div class=\"role_" + role.ToString() + "\" style=\"" + style + "\">");
    return new RoleContainer(writer);
}
相关问题