Как сделать если зависит использование HtmlHelper - PullRequest
0 голосов
/ 26 мая 2011

Я использую asp.net MVC 2.0.У меня есть следующее расширение HtmlHelper:

AdminOnly(HtmlHelper helper, IPrincipal User, string htmlToRender)
{
   //Render Html if have admin access.
}

Мне нужно изменить его для использования таким образом: AdminOnly (Пользователь) .TextBoxFor (x => x.MyField), чтобы он мог визуализировать поле редактированияMyField, только если у пользователя есть права администратора.


А пока я предлагаю следующее решение:

AdminOnly(this MvcHtmlString resString, IPrincipal User)
{
   //Render Html if have admin access.
}

Итак, в коде я могу написать что-то вроде:

<%:Html.TextBoxFor(x=>x.MyProperty).AdminOnly(User)%>

Это работает, но я хотел бы иметь возможность добавить больше входных данных или больше гибкости для добавления текста до и после входных данных, например:

<%:Html.PlainText("Set your age: ").TextBoxFor(x=>x.Age).AdminOnly(User)%>

или

<%: Html.AdminOnly("Set your age: ", User).AddTextBoxFor(x=>x.Age)%>

1 Ответ

1 голос
/ 26 мая 2011

1) Если вы не ожидаете отрисовки чего-либо другого, кроме текущей идентичности, и вы используете Thread.CurrentPrincipal, я бы рекомендовал пропустить параметр user и использовать HttpContext.Current.User или Thread.CurrentPrincipal.

2) Использование цепных вызовов методов, вероятно, потребует довольно много работы, вместо этого я рекомендую воспользоваться лямбда-выражениями.

Расширение:

public static MvcHtmlString AdminOnly(this HtmlHelper htmlHelper, Func<MvcHtmlString> action)
{
    if (HttpContext.Current.User.IsInRole("admin"))
        return action();

    return MvcHtmlString.Empty;
}

Использование:

<%: Html.AdminOnly(() => Html.TextBoxFor(m => m.Field)) %>

редактировать: обновлено для MVC 2

...