2

我想创建 Html 助手,仅当用户扮演角色时才会显示内部内容,如下所示:

@using(Html.AdminBlock()) {

}

并且块中的代码仅在用户角色时才会显示......

我怎么能做到?

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

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

.

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

2 回答 2

1

使用返回的 HTML 帮助程序无法实现您想要做的事情IDisposable。这样做的原因是因为它的主体总是会被渲染。您不能有条件地将主体排除在这样的语句中:

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

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

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

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

@if(Html.IsAdmin()) {
    <span>hey</span>
}
于 2013-04-06T17:17:42.960 回答
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")) {
    ...
}

制作自定义助手

去年我发布了一篇关于这个主题的博客文章BeginForm(),我打开了 ASP.NET MVC 源代码,看看它是如何组合在一起的,并且是我自己的。这是亮点,这将允许您<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())
{
    ...
}
于 2013-04-06T16:58:41.263 回答