Другая возможность будет выглядеть примерно так:
Определите базовый класс или интерфейс, скажем «UserState». Определите три класса, которые расширяют этот класс, каждый из которых представляет свое состояние пользователя, например UserAdmin, UserNormal, UserAnonymous.
Определите метод в вашей логике модели следующим образом:
<pre></p>
<pre><code>public void UserState GetUserState(User user)
{
if (user.IsInRole("Admin"))
{
return new UserAdmin(user);
}
if (user.Identity.IsAuthenticated)
{
return new UserNormal(user);
}
return new UserAnonymous();
}
Возможно, вы могли бы вызвать его из помощника html:
</p>
<pre><code>public static UserState GetUserState(this HtmlHelper html)
{
var user = html.ViewContext.HttpContext.User;
return MyModelLogic.GetUserState(user);
}
Затем в _layout.cshtml:
</p>
<pre><code>@{ var userState = Html.GetUserState(); }
@Html.DisplayFor(_ => userState)
Наконец, вы можете реализовать отдельный шаблон отображения для каждого класса, который наследует UserState. Таким образом, у вас есть отдельное представление для каждого состояния пользователя, и логика, которая решает, какая из них используется, не имеет ничего общего с уровнем представления.