#c# #.net #asp.net #asp.net-mvc
#c# #.net #asp.net #asp.net-mvc
Вопрос:
Я знаю, что вы хотите исключить логику из своих представлений. Я могу устранить большинство циклов, используя DisplayFor / EditorFor и передавая IEnumerables в представление.
Как насчет операторов IF? следует ли их полностью избегать в представлениях? используются редко? в качестве последнего средства?
Допустим, вы хотели показать, скрыть элемент на основе роли пользователя…Как бы вы это сделали без оператора IF … возможно, полностью отдельного представления?
Просто пытаюсь получить представление о лучших практиках.
Спасибо!
Ответ №1:
Будьте последовательны и помните о цели представления — создать ваш HTML. Для достижения этой цели, конечно, вам понадобятся некоторые if
конструкции здесь или там. Я думаю, некоторые люди предлагают вам придерживаться какого-то фантастического, сверхшаблонного пуризма в ущерб удобному, функциональному, четко определенному коду.
Комментарии:
1. На самом деле я бы задал обратный вопрос. Почему бы мне не поместить оператор if в мое представление? Иногда отображаемое зависит от состояния модели.
2. @Serge — хаха … спасибо 🙂 @mcl — Я согласен. Это редкое представление, за исключением частичных или чрезвычайно простых, в котором нет какой -то необходимости решать, какой HTML создавать , на основе некоторого условия модели. То, что некоторые люди предложили ниже, на самом деле нарушает концепцию разделения проблем :: Он конкретно просит модель или контроллер обрабатывать, как отображать вещи.
Ответ №2:
Нет ничего плохого в использовании if
s в ваших представлениях, если в конечном итоге вы не добавляете в них внутреннюю логику.
Ответ №3:
У Роба Конери есть эмпирическое правило, которое гласит «если есть и IF, создайте помощника». Лично я бы сказал «использовать экономно». Я избегаю этого, насколько это возможно, потому что это усложняет модульное тестирование.
В ситуации, когда вы хотите скрыть элементы на основе ролей пользователей: Для простых сценариев я бы, вероятно, поставил проверку непосредственно в представлении. Обычно я все же стараюсь сделать их более краткими и тестируемыми. Поэтому вместо:
@if (HttpContext.Current.User.IsInRole("admin")
{
// Show admin stuff
}
Я бы сделал что-то вроде:
@if (Model.UserIsAdmin)
{
// Show admin stuff
}
С другой стороны, если бы такого рода проверки начали распространяться по всем вашим представлениям, я бы, вероятно, сначала создал элементы условно в viewmodel, а затем просто отобразил то, что было создано. Надеюсь, это поможет.
Ответ №4:
В принципе, каждое представление должно отображать то, что передано в ViewModel. Если ViewModel недостаточно, то я бы поискал способ улучшить само создание ViewModel, а не логику представления.
Все условные выражения МОГУТ быть оценены при создании ViewModel.
Конечно, все зависит от того, насколько пользовательская логика в представлении допускает вашу проектную организацию.
Ответ №5:
Я думаю, что лучше избегать if в представлении, вам следует избегать логики бизнеса (модели) или приложения (контроллера) в представлении в вашем примере вы можете создать другое частичное представление для отображения, которое, по мнению некоторых, зависит от роли пользователя, и в контроллере поместить логику для того, какое представление вам нужно показать
Ответ №6:
На мой взгляд, If / else можно использовать экономно, но для примера, который вы упомянули, скройте элемент на основе роли — проверки if определенно не должно быть в представлении. Напишите расширения и помощники там, где это необходимо.
Ответ №7:
Я бы предложил скрыть элемент с помощью «if» в представлении, но в коде вы должны отключить функцию (метод), которая активируется скрытым элементом.
Комментарии:
1. Кстати, я хотел сказать, что if должно быть упрощенным: if (модель. Кнопка IsButtonOkVisible) //показать кнопку.