Являются ли операторы IF ..ELSE в представлении неодобрительными в ASP.NET MVC?

#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) //показать кнопку.