Сначала я рассмотрю конкретный вопрос, а затем реферат:
Бетон
Одним из возможных путей может быть создание набора помощников HTML или пользовательских элементов управления, которые имеют некоторую базовую логику, чтобы определить, должны ли они быть видимыми. Например, вы можете использовать:
<td>
Html.LinkList(", "
ActionLinks.ViewDetails(item),
ActionLinks.DeleteAndConfirm(item),
ActionLinks.Approve(item))
</td>
Каждое действие содержит собственную логику для определения того, должно ли оно использоваться (например, «Мне требуются права администратора»), и если это действие определяет, что его собственные критерии не выполнены, просто верните string.Empty
:
class ActionLinks
{
public static string Approve(Item item)
{
if(ItemRequiresApproval(item) && CurrentUserIsAdmin())
{
return Html.ActionLink("Approve", "Approve", new { id = item.Mail_ID });
}
else
{
return string.Empty;
}
}
private static bool ItemRequiresApproval(Item item)
{
//determine whether item requires approval
//this could be further broken into a separate utilities class
}
private static bool CurrentUserIsAdmin()
{
//this should definitely go in a separate class dedicated to
//handling membership and authorization
//as well as figuring out who the current user is
}
}
LinkList будет выглядеть примерно так:
string LinkList(string delimiter, params string[] links)
{
StringBuilder sb = new StringBuilder();
foreach(string link in links)
{
if(!string.IsNullOrEmpty(link))
{
sb.Append(delimiter);
sb.Append(link);
}
}
return sb.ToString().Substring(delimiter.Length);
}
Аннотация
Решение вашей проблемы заключается в запоминании SRP (Принцип единой ответственности) и SOC (Разделение проблем) . В вашем текущем примере ваш View - это класс. Вы сделали этот класс ответственным не только за общую структуру разметки, но и за каждую мелкую деталь почти всего вашего приложения! Ваше мнение не должно знать или заботиться о правах администратора или одобрении. Только кнопки подтверждения должны знать об утверждении. Только элементы, которые являются специфическими для администратора, должны знать о правах администратора. Если вы обнаружите, что повторяете определенные виды проверок (например, «если администратор показывает x, иначе показывает y»), создайте некоторые общие обертки, такие как AdminPanel, которые будут соответствующим образом включаться или выключаться. Для всех остальных игроков данный элемент просто является или не является - и именно этот элемент несет ответственность за принятие этого решения.