У меня есть выпадающий список, который отображает значения из таблицы для конечного пользователя. Я хотел бы, чтобы эти значения были отсортированы в алфавитном порядке.
Согласно надлежащему дизайну MVC, на каком уровне я должен разместить свою логику сортировки: модель, представление или контроллер?
РЕДАКТИРОВАТЬ : В ответ на вопрос Ларша: «Вы имеете в виду код, который определяет, какой порядок сортировки является желательным? Или код, который выполняет сортировку?», Я первоначально имел в виду код, который определяет, какой порядок сортировки является желательным.
asp.net-mvc
model-view-controller
Райан Кон
источник
источник
Ответы:
(Примечание: эта цитата и цитата взяты из ответа @ dasblinkenlight , но мы не согласны с нашей интерпретацией. Прочитайте его пост и определитесь ).
Согласно описанию MVC ,
Логика сортировки (например, сортировочный компаратор / алгоритм сортировки) принадлежит модели, поскольку она содержит бизнес-правила и данные состояния. Поскольку изменение способа сортировки данных модели прямо попадает в категорию «изменить представление представления модели», контроллер отвечает за «выполнение сортировки» путем вызова метода model.changeSortedState ().
источник
public void Sort(bool sortByDescending = false)
, где если false, то сортируется по возрастанию. Или просто есть два разных метода сортировки, если логика сильно отличается.Кто контролирует порядок сортировки?
(Из Википедии )
1) Естественный порядок в самих данных:
Заказ является частью модели, поэтому он должен идти туда. Необработанное извлечение «всех данных» вернет данные в отсортированном порядке, и нет интерфейса для выбора порядка сортировки.
2) Пользователь должен контролировать, как они видят данные:
Представление предоставит интерфейс (такой как восходящие / нисходящие стрелки), который взаимодействует с Контроллером, и Модель понимает данные достаточно хорошо, чтобы выполнить запрошенную сортировку данных. Тем не менее, в отличие от (1), необработанные данные не обязательно должны быть отсортированы.
В любом случае,
Представление не понимает, что происходит сортировка, кроме возможности показать, какое направление сортировки было выбрано. Не помещайте логику там.
Небольшое предостережение
Функциональность сортировки может идти исключительно в представлении, при одном обстоятельстве (что я могу придумать не по порядку; может быть больше):
«Тупая» сортировка, когда все данные уже находятся в представлении, и ей не нужно использовать какие-либо знания предметной области для выполнения сортировки. Например, очень простое сравнение строк или чисел. Это невозможно, например, в результатах поиска на веб-странице, когда результаты могут быть разделены на несколько страниц.
источник
Согласно описанию MVC ,
В соответствии с этим логика сортировки принадлежит контроллеру, поскольку изменение способа сортировки данных модели прямо попадает в категорию «изменение представления представления модели».
РЕДАКТИРОВАТЬ: Чтобы прояснить несколько недоразумений, высказанных в комментариях, «логика сортировки» не является кодом, который выполняет сортировку; это код, который определяет сортировку. Логика сортировки сравнивает отдельные элементы друг с другом, чтобы установить порядок (например, через экземпляр
IComparator<T>
) или содержит логику, которая создает объект, который будет использоваться для упорядочения внешней системой (например, через экземплярIOrderedQueryable<T>
). Эта логика принадлежит вашему контроллеру, потому что она требует знаний, связанных с «бизнес» стороной вашего приложения. Этого вполне достаточно для выполнения сортировки, но она отделена от кода, который фактически выполняетЭто. Код, который сортируется, может быть в вашем представлении, в вашей модели или даже на уровне персистентности, который поддерживает вашу модель (например, вашу базу данных SQL).источник
IComparer<T>
. Оставшаяся «стандартная механика» сортировки, включая извлечение данных из модели, остается на виду.{Unknown, Pass, Fail}
. Далее предположим, чтоUnknown
сортировка всегда должна выполняться последней, независимо от того, какой пользователь выбрал возрастающий или убывающий порядок. Размещение этой логики в представлении слишком много скажет вашему представлению о деловой природе данных внутриcode
поля. Представление не должно знать этого: все, что он знает, - это то, что пользователь выполнил жест «сортировки» (например, щелкнул заголовок); остальное зависит от контроллера.Ни один из вышеперечисленных. Сортировка - это бизнес-логика, а бизнес-логика не относится ни к одному из трех. Не каждый фрагмент кода в вашем приложении будет моделью, представлением или контроллером.
Что я обычно делаю в своих приложениях MVC, так это то, что у меня есть сервисный уровень, который выполняет всю бизнес-логику. Методы на уровне сервиса должны иметь чистый, простой API с хорошо именованными параметрами. Затем вы можете вызывать эти методы из вашего контроллера для манипулирования данными в моделях.
В этом смысле сортировка происходит «в контроллере», но сам код, который выполняет сортировку, не должен реализовываться в контроллере, а вызываться только оттуда.
источник
Определенно не контроллер: он отправляет сообщения для просмотра и моделирования, но должен выполнять как можно меньше работы. Если пользователь может изменить сортировку, этот запрос обрабатывается контроллером, информируя модель или представление об этом.
Может быть, View, если это чистая вещь View. Если приложение работает так же хорошо, без сортировки, то сортировка является лишь частью представления и должна идти в представлении.
Если порядок является неотъемлемой частью домена, он должен идти в модели.
источник
Таким образом, выбор - вы думаете, что это является частью бизнес-логики домена или логики представления.
Если бы вы реализовывали правильный MVC Model2 или классический шаблон MVC, то я бы сказал, что упорядочение данных, предоставляемых уровнем модели, должно инициироваться запросом представления к уровню модели. Вид запрашивает упорядоченные данные, модельный слой предоставляет их.
Но, поскольку вы используете интерпретацию шаблона MVC в ASP.NET MVC, которая немного отличается от вашей стандартной MVC - экземпляр ViewModel должен запрашивать упорядоченную информацию из уровня модели (по какой-то причине платформа ASP.NET считает, что шаблоны следует вызывать "Представления" и представления должны называться "представлениями" .. это странно).
источник
Я обычно делал бы это в контроллере, чтобы оставаться в соответствии с шаблоном согласно другим ответам. Смотрите ниже для рассуждений.
Я обдумывал это, читал ответы и связанный материал, и, прагматично говоря, я бы сказал, что это будет зависеть, например, от вашей заявки:
Это среднее / большое приложение и / или с ним связано несколько пользовательских интерфейсов (т. Е. Приложение Windows, веб-интерфейс и интерфейс телефона).
Если это четко определенный веб-сайт с пользовательским интерфейсом, и вы используете что-то вроде EF Code First, и у вас нет или нет намерения создавать сервисный уровень и вы планируете использовать простой готовый метод Extension для его получения:
Если он такой же, как указано выше, НО не может быть реализован с помощью метода расширения «из коробки».
Подводить итоги:
Догматический ответ: Сервисный уровень
Прагматичный ответ: обычно контроллер
источник
Я бы предложил сортировать данные из табличных данных, которые достаточно малы, чтобы быть полезными в раскрывающемся списке - должны поступать из БД, уже отсортированной по запросу. Для меня это делает модель местом, где применяется сортировка.
Если вы полны решимости выполнить сортировку вручную, я думаю, что есть хорошие аргументы для использования либо модели, либо контроллера в качестве предпочтительного места для логики. Ограничение будет вашей конкретной структурой. Я предпочитаю управлять данными исключительно в модели. Я использую контроллер, чтобы объединить данные (модель) и представление (представление), как меня (само) учили.
источник
Хотя я в принципе согласен с идеей, что сортировка - это бизнес-логика, потому что, разбив ее на ее происхождение, вы получите что-то вроде «Клиент хотел бы, чтобы страница продукта отображалась с изображениями, отсортированными по дате», тогда становится ясно, что порядок сортировки данных, как правило, не является произвольным - даже если сортировка не выполняется, так как это все еще является бизнес-решением по причине пропуска (пустой список по-прежнему остается списком).
НО ... Эти ответы, кажется, не учитывают достижения в технологии ORM, я могу говорить только в отношении Entity Framework (давайте избегать споров о том, является ли это истинным ORM, это не главное) от Microsoft как это то, что я использую, но я уверен, что другие ORM предлагают аналогичную функциональность.
Если я создам строго типизированное представление для класса Product, используя MS MVC и Entity Framework, и между таблицей Product и Image (например, FK_Product_Image_ProductId) есть связь по внешнему ключу, то я смог бы быстро выполнить сортировку из коробки. изображения во время их отображения, используя что-то вроде этого в представлении:
Было упомянуто о конкретном слое бизнес-логики, который я также использую для выполнения 80% своей бизнес-логики, но я не собираюсь вписывать функциональность сортировки в свой слой бизнес-логики, который имитирует что-то из коробки из Entity Framework.
Я не думаю, что есть правильный ответ на этот вопрос, кроме как сказать это; Вы должны абстрагироваться от сложной бизнес-логики, где это возможно, но не за счет изобретения колеса.
источник
myList.OrderBy(x => x.CreationDate)
- на самом деле нет необходимости вводить какой-либо ненужный дополнительный слой просто для этого. Чтобы добавить к этому, что они будут делать, если им нужны разбитые на страницы и отсортированные данные? Запросить всю таблицу, отсортировать ее и сохранить то, что им нужно? Можно просто позвонить,myList.OrderBy(x => x.Date).Skip((page-1)*pageSize).Take(pageSize)
и никакие ненужные данные не будут получены.Предположим, у вас есть веб-сайт MVC, веб-сайт WebForms и мобильное приложение.
Если вы хотите, чтобы сортировка была согласованной между этими уровнями представления, то я бы сказал, сортировка вне уровня представления. Служба будет хорошим кандидатом.
В противном случае я бы сохранил эту логику в модели представления. Зачем? Потому что он будет многоразовым и легко проверяемым.
источник
Из трех перечисленных я бы сказал, что он принадлежит контроллеру. Мне не очень нравится размещать такую логику в контроллере. Я обычно создаю сервисный уровень, с которым взаимодействует контроллер, который будет отвечать за связь с хранилищем данных и обработку логики сортировки. Для небольших приложений это хорошо, сидя в контроллере, хотя.
источник
Этот вопрос задан с учетом asp.net, но, поскольку кто-то упомянул Rails, я подумал, что было бы интересно рассмотреть проблему в этом контексте. В Rails вполне естественно и довольно часто выполнять сортировку вместе с извлечением в качестве действия контроллера, поскольку для этого предусмотрены инфраструктура и API-интерфейсы ActiveRecord / ActiveQuery. С другой стороны, можно определить какой-то пользовательский порядок сортировки для статических элементов и поместить его в модель, которая будет использоваться контроллером, чтобы модель могла играть роль в логике сортировки, даже если она не выполняется. операция напрямую. Что бы это ни было, можно с уверенностью сказать, что представление логики сортировки, как правило, осуждается.
Я немного удивлен, что некоторые ответы абсолютно против использования сортировки в контроллере или модели, и я считаю их слишком педантичными на мой вкус, но я полагаю, что это зависит от природы используемой платформы и обычных соглашений, связанных с Это. Я также согласен с комментарием Билла К. о том, что разделение в первую очередь важнее.
источник