代码之家  ›  专栏  ›  技术社区  ›  Zilberman Rafael

使用Html帮助程序创建

  •  2
  • Zilberman Rafael  · 技术社区  · 13 年前

    我想创建一个Html帮助程序,它将只在用户处于角色时显示内部内容, 类似这样的内容:

    @using(Html.AdminBlock()) {
    
    }
    

    并且只有当角色中的用户。。。

    我该怎么做?

    如果您不理解我在这里的意思,例如,我希望这两个代码将返回相同的结果:

    @if(Html.IsUserInRole("Admin")) {
        <span>hey</span>
    } 
    

    .

    @using(Htm.RoleBlock()) {
        <span>hey</span>
    }
    
    2 回复  |  直到 13 年前
        1
  •  1
  •   Darin Dimitrov    13 年前

    对于正在返回的HTML帮助程序,您所要做的是不可能的 IDisposable 原因是因为它的身体会 总是 被渲染。您不能有条件地将主体排除在这样的语句中呈现:

    @using(Htm.RoleBlock()) {
        <span>hey</span>
    }
    

    此外,以下内容看起来足够可读:

    @if(Html.IsUserInRole("Admin")) {
        <span>hey</span>
    }
    

    或者,您可以编写一个返回布尔值的助手,并可以这样使用:

    @if(Html.IsAdmin()) {
        <span>hey</span>
    }
    
        2
  •  0
  •   Daniel Imms    13 年前

    更新2

    因此,您希望尽可能多地将逻辑排除在视图之外,在这种情况下,您可以将if条件从视图中提取出来,并放入 HtmlHelper 扩展方法。

    public static class HtmlHelperExtensions
    {
        public static bool IsAdmin(this HtmlHelper htmlHelper)
        {
            return htmlHelper.ViewContext.HttpContext.Current.User.IsInRole("admin");
        }
    }
    

    用法:

    @if (Html.IsAdmin()) {
        ...
    }
    

    使现代化

    如果你只想在用户扮演角色的情况下输出一些东西,那么这种帮助者就太过分了。你应该选择一个简单的 if 在您看来。

    @if (HttpContext.Current.User.IsInRole("admin")) {
        ...
    }
    

    制作自定义帮助程序

    我发布了 blog post 关于这个主题,去年我打开了ASP.NET MVC源代码,看看如何 BeginForm() 是我自己做的。以下是亮点,这将允许您包装 <div> 围绕MVC视图中的块。

    public class MvcDiv : IDisposable
    {
        private bool _disposed;
        private readonly FormContext _originalFormContext;
        private readonly ViewContext _viewContext;
        private readonly TextWriter _writer;
    
        public MvcDiv(ViewContext viewContext)
        {
            if (viewContext == null)
            {
                throw new ArgumentNullException("viewContext");
            }
    
            _viewContext = viewContext;
            _writer = viewContext.Writer;
            _originalFormContext = viewContext.FormContext;
            viewContext.FormContext = new FormContext();
    
            Begin();
        }
    
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    
        public void Begin()
        {
            _writer.Write("<div>");
        }
    
        private void End()
        {
            _writer.Write("</div>");
        }
    
        protected virtual void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                _disposed = true;
                End();
    
                if (_viewContext != null)
                {
                    _viewContext.OutputClientValidation();
                    _viewContext.FormContext = _originalFormContext;
                }
            }
        }
    
        public void EndForm()
        {
            Dispose(true);
        }
    }
    

    然后把这个扩展方法放在某个地方:

    public static class HtmlHelperExtensions
    {
        public static MvcDiv BeginDiv(this HtmlHelper htmlHelper)
        {
            return new MvcDiv(htmlHelper.ViewContext);
        }
    }
    

    然后你可以这样使用它:

    @using (Html.BeginDiv())
    {
        ...
    }