使用Html Helper创建

本文关键字:创建 Helper Html 使用 | 更新日期: 2023-09-27 18:07:53

我想创建一个Html助手,将显示内部内容,只有当用户在角色,像这样:

@using(Html.AdminBlock()) {
}

只有当user在role…

我该怎么做?

如果你不明白我在这里的意思,我希望这两个代码将返回相同的结果:

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

.

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

使用Html Helper创建

您正在尝试做的是不可能与返回IDisposable的HTML帮助器。这样做的原因是它的主体将始终呈现。您不能有条件地将正文排除在这样的语句中:

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

此外,下面的代码看起来足够可读:

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

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

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

更新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")) {
    ...
}

创建自定义帮助器

我在去年的博客上发表了一篇关于这个话题的文章。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())
{
    ...
}