簡體   English   中英

使用HTML Helper創建

[英]Creating using Html Helper

我想創建Html幫助程序,僅當用戶擔任角色時才顯示內部內容,如下所示:

@using(Html.AdminBlock()) {

}

並且僅當用戶擔任角色時,才會顯示塊中的代碼...

我該怎么做?

如果您不理解我的意思,那么我希望這兩個代碼返回相等的結果:

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

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

返回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")) {
    ...
}

制作自定義助手

去年,我發布了有關此主題的博客文章 ,在那里我打開了ASP.NET MVC源代碼,以了解BeginForm()是如何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())
{
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM