【问题标题】:How can I create a Html Helper like Html.BeginForm如何创建像 Html.BeginForm 这样的 Html Helper
【发布时间】:2011-11-28 07:08:35
【问题描述】:

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

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

我想要类似的东西:

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

这会写成这样的:

<div class="role_Content_General_Website" style="display:none;">
    ...
</div>

如果用户有权访问,则使用display:block;...

我可以创建一个简单的HtmlHelper,但我如何编写一个同时输出结尾&lt;/div&gt;

public static string RoleAccess(
         this HtmlHelper helper, 
         UserInfo user, 
         RoleAccessType role)
{
   return 
       String.Format(
            "<div class='role_{0}' style='display:{1}'>", 
            role.ToString(), user.HasAccess(role));
}

【问题讨论】:

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


    【解决方案1】:
    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);
    }
    

    【讨论】:

    • 首先,谢谢达林!例如,当元素是&lt;li&gt; 时,我还添加了一个覆盖来追加display:none,但是在执行return "style='display:none;'"; 我得到style=&amp;#39;display:none;&amp;#39; 我应该返回什么所以我的扩展助手不需要@Html.Raw(Html.RoleAccess(...)) {}?跨度>
    • 如果我想将容器嵌套在“元容器”中怎么办?我不知道要返回什么:// public static IDisposable BeginFieldset(this HtmlHelper htmlHelper, string label, object htmlAttributes = null) { using (htmlHelper.BeginClosableTag("div", attr)) { using (htmlHelper.BeginClosableTag("fieldset", null)) { var legend = new TagBuilder("legend"); //... var writer = htmlHelper.ViewContext.Writer; writer.WriteLine(legend.ToString()); return new ClosableTag(writer, ""); } } } 其中ClosableTag 就像RoleContainer
    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2015-04-07
    相关资源
    最近更新 更多