Як "роздільні" повинні бути погляди?

Я розумію, що вигляд повинен відображати лише матеріал і не створювати жодної логіки за межами того, що потрібно для відображення інформації.

Який найкращий спосіб, якщо враховувати це на увазі, вирішувати такий типовий сценарій:

  1. Кліки користувача видаляють елемент
  2. Якщо товар все ще асоціюється з іншими, показати "ви не можете видалити це"
  3. Подібне, показати форму підтвердження, яка надсилається до дії/Видалити/Id

Я міг би дуже легко побачити щось на зразок:

@if (Model.Children.Count > 0)
{
  
You can't delete this!

} else { using (Html.BeginForm()) {
Are you really sure you want to delete this?


<input type="submit" value="Confirm" /> | @Html.ActionLink("Cancel", "Index")

} }

Чи існує вагома причина для створення TWO Views і контролер повертає відповідне представлення залежно від того, скільки дітей існує? Схоже на компроміс простоти і розмежування проблем.

6
Я буду використовувати два представлення, його завжди краще, щоб ваші думки були максимально простими.
додано Автор Emmanuel N, джерело

3 Відповіді

Це досить простий приклад, тому на перший погляд це виглядає нешкідливим (і якщо він залишається таким чином, це звичайно є). Однак слід пам'ятати про ці фактори:

  • Що робити, якщо це стане більше, ніж просто діти? Можливо, з часом з'являються три інші відносини, і тепер вам потрібно перевірити всі на ваш погляд? Раптом запах коду набагато сильніший.
  • Застосування такого типу логіки в контролері може зробити інші підходи до проблеми більш очевидними або легкими пізніше, наприклад, додати версію ajax, яка дає користувачеві можливість "видалити це" відгук, не залишаючи попереднього сторінка
4
додано

Я б відокремив їх у двох різних режимах перегляду і мав дію контролера вибрати правильний вигляд на основі значення моделі перегляду (Children.Count в цьому випадку). Але, як це сказано, інший підхід теж не помилковий. Він чудово працює для таких сценаріїв, як це.

3
додано

Для такого типу сценарію зазвичай ви матимете властивість Model, яка насправді була прапором, чи можете ви її видалити чи ні (це більше відповідає підході ViewModel), так що представлення фактично не виконує логіку, Контролер просто розповідає, яка дія доступна.

@if(Model.CanDelete) {
    using (Html.BeginForm())
    {
        
Are you really sure you want to delete this?


<input type="submit" value="Confirm" /> | @Html.ActionLink("Cancel", "Index")

} } else {
You can't delete this!

}

CanDelete можна заповнити в контролері, використовуючи комбінацію стану дочірніх даних, членства в ролі, бізнес-статусу тощо, але щоб переглянути всі ці матеріали, не має значення

2
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug