使用Html Helper创建

时间:2013-04-06 16:49:41

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

我想创建Html帮助器,只有当用户在角色中时才显示内部内容, 像这样:

@using(Html.AdminBlock()) {

}

只有用户处于角色中时才会显示块中的代码...

我该怎么做?

如果您不明白我的意思,我希望这两个代码会返回相同的结果:

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

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

2 个答案:

答案 0 :(得分:1)

使用返回IDisposable的HTML帮助程序无法实现您的目的。这样做的原因是因为它的主体将始终被渲染。您不能有条件地排除身体在这样的陈述中被渲染:

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

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

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

或者您可以编写一个将返回布尔值的帮助器,并且可以像这样使用:

@if(Html.IsAdmin()) {
    <span>hey</span>
}

答案 1 :(得分:0)

更新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()是如何组合在一起制作的。以下是重点,这将允许您在MVC视图中围绕块包裹<div>

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())
{
    ...
}