Как я могу создать Html Helper, как Html.BeginForm - PullRequest
14 голосов
/ 28 ноября 2011

У меня есть метод расширения, который проверяет, может ли пользователь видеть часть веб-страницы на основе роли.

Если я просто удаляю контент, это приносит мне больше работы, так как все пропущенные формы не будут правильно зарегистрированы при сохранении, и мне придется бороться с этим поведением, изменяя весь мой код, поэтому я подумал, почему бы просто не использовать display:none; атрибут?

Я бы хотел что-то вроде:

@using(Html.RoleAccess(currentUser, RoleAccessType.Content_General_Website))
{
    ...
}

и что это напишет что-то вроде:

<div class="role_Content_General_Website" style="display:none;">
    ...
</div>

или используйте display:block;, если у пользователя есть доступ ...

Я могу создать простой HtmlHelper, но как мне написать тот, который также выводит окончание </div>?

public static string RoleAccess(
         this HtmlHelper helper, 
         UserInfo user, 
         RoleAccessType role)
{
   return 
       String.Format(
            "<div class='role_{0}' style='display:{1}'>", 
            role.ToString(), user.HasAccess(role));
}

1 Ответ

22 голосов
/ 28 ноября 2011
public static class HtmlExtensions
{
    private class RoleContainer : IDisposable
    {
        private readonly TextWriter _writer;
        public RoleContainer(TextWriter writer)
        {
            _writer = writer;
        }

        public void Dispose()
        {
            _writer.Write("</div>");
        }
    }

    public static IDisposable RoleAccess(this HtmlHelper htmlHelper, string role)
    {
        var user = htmlHelper.ViewContext.HttpContext.User;
        var style = "display:none;";
        if (user.IsInRole(role))
        {
            style = "display:block;";
        }
        var writer = htmlHelper.ViewContext.Writer;
        writer.WriteLine("<div class=\"role_Content_General_Website\" style=\"" + style + "\">");
        return new RoleContainer(writer);
    }
}

и затем вы можете использовать его так:

@using(Html.RoleAccess("Administrator"))
{
    ...
}

Очевидно, вы можете адаптировать аргументы помощника в соответствии с вашими требованиями:

public static IDisposable RoleAccess(
    this HtmlHelper helper, 
    UserInfo user, 
    RoleAccessType role
)
{
    var style = "display:none;";
    if (user.HasAccess(role))
    {
        style = "display:block;";
    }
    var writer = htmlHelper.ViewContext.Writer;
    writer.WriteLine("<div class=\"role_" + role.ToString() + "\" style=\"" + style + "\">");
    return new RoleContainer(writer);
}
...