Насколько «разделенными» должны быть представления? - PullRequest
6 голосов
/ 28 октября 2011

Я понимаю, что представление должно только отображать вещи и не делать никакой логики вне того, что требуется для отображения информации.

Как лучше всего учитывать этот простой сценарий:

  1. Пользователь нажимает Удалить элемент
  2. Если элемент все еще связан с другими, покажите «Вы не можете удалить это».
  3. Иначе, показать форму подтверждения, что сообщения для действий / Удалить / Id

Я мог бы очень легко сделать что-то вроде:

@if (Model.Children.Count > 0)
{
  <p>
    You can't delete this!
  </p>
}
else
{
  using (Html.BeginForm())
  {
    <p>
        Are you really sure you want to delete this?
    </p>
    <p>
        <input type="submit" value="Confirm" /> |
        @Html.ActionLink("Cancel", "Index")
    </p>
  }
}

Есть ли веская причина для создания ДВУХ видов, и чтобы контроллер возвращал соответствующий вид в зависимости от количества детей? Похоже на компромисс простоты и разделения интересов.

Ответы [ 3 ]

4 голосов
/ 28 октября 2011

Это довольно простой пример, поэтому на первый взгляд он выглядит безвредным (и если так и останется, то это, безусловно, так). Однако помните об этих факторах:

  • Что если это станет больше, чем просто дети? Может быть, со временем появятся три других отношения, и теперь вам нужно проверить их все на ваш взгляд? Внезапно запах кода становится намного сильнее.
  • Размещение этого типа логики в контроллере может сделать другие подходы к проблеме более очевидными или более простыми позже, например, добавление версии ajax, которая позволяет дать пользователю обратную связь «Вы не можете удалить это», не выходя из предыдущего стр.
3 голосов
/ 28 октября 2011

Я бы разделил их в 2 разных представлениях, и чтобы действие контроллера выбрало правильное представление на основе значения модели представления (в данном случае Children.Count). Но, как говорится, другой подход тоже не ошибается. Он отлично работает для простых сценариев, подобных этому.

2 голосов
/ 28 октября 2011

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

@if(Model.CanDelete) {
    using (Html.BeginForm())
    {
        <p>
        Are you really sure you want to delete this?
        </p>
        <p>
            <input type="submit" value="Confirm" /> |
            @Html.ActionLink("Cancel", "Index")
        </p>
    }
} else {
    <p>You can't delete this!</p>
}

CanDelete можно заполнить в контроллере, используя комбинацию дочерних состояний данных, членства в ролях, бизнес-статуса и т. д., но только представлениювсе эти вещи не должны иметь значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...