DateTime.Now.ToString ( "ГГГГММДДччммсс");
, если вы просто хотите, чтобы он отображался как строка
Для небольших проектов вы правы. Я слышу ваш аргумент и сочувствую - однако есть веские причины для этой, тяжелой и повторяющейся работы, особенно в более крупных и более сложных приложениях:
Repository.Get
может возвращать lazily-оцененный объект IQueryable
, что означало бы, что БД не пострадает, пока не будет оценен вид. По целому ряду причин это плохо. (Обходной путь состоит в том, чтобы вызвать .ToList
, пока он все еще находится в контроллере). User { UserId, UserName, PasswordHash, PasswordSalt, EmailAddress, CreatedDate }
, тогда как поля на странице «Сведения о пользователе» будут User { UserId, UserName, Password, ConfirmYourPassword, EmailAddress }
, do вы видите разницу? Ergo, вы не можете использовать модель пользователя EF в качестве модели представления, вы должны использовать отдельный класс. UserId
. ASP.NET будет переписывать это значение во время привязки и, если вы специально не дезинформируете его (что будет так же тяжело, как создание отдельных ViewModels), тогда эта уязвимость останется. небольшое обходное решение в вашем случае Я поделюсь с вами, но учтите предварительные условия:
... тогда вы можете сделать это:
ViewData
, или ViewBag
в MVC 4 (или даже общий ViewData<T>
, если вы хардкор). Это полезно для хранения заголовков HTML-страниц и обмена данными с мастер-страницами. View<TModel>
. Но используйте этот подход с осторожностью, потому что он может ввести несогласованность.
По моему мнению, важно иметь еще один слой (ViewModel) поверх уровня модели для сложных приложений, выполняющих большую часть операций CRUD, поскольку имеет следующие преимущества:
Если вы используете те же модели, что и ваши модели ViewModels, ваше приложение должно быть очень маленьким и простым и должно содержать только операции CRUD. Но если вы строите большие или корпоративные приложения с большими командами (с двумя или, вероятно, с большим количеством разработчиков), у вас должны быть такие понятия, как инжекция зависимостей, сервисы, репозитории, фасады, единицы работы, объекты доступа к данным и т. Д.
Чтобы упростить ваши потребности в сопоставлении между моделями и ViewModels, вы можете использовать AutoMapper https://github.com/AutoMapper/AutoMapper
или установить с помощью nuget Install-Package AutoMapper
Ну, я начинаю думать, что нужен прагматичный подход к каждой проблеме, а не просто подписываться на архитектурные стандарты пуриста.
Чем меньше зависимостей у вас есть между Model, View и Controller, тем проще будет сделать это изменения в DomainModel, не нарушая контрактов интерфейса в представлении и контроллере и т. д. и т. д. Но опять-таки это будет что-то прагматичное. Мне нравится подход, поскольку перефакторинг кода является большой частью системного обслуживания - рефакторинг может включать в себя простую орфографическую ошибку для свойства модели - это изменение может пульсировать через код до уровня Контракта, если зависимости не разделены; например.
Простой пример datetime, хранящийся в Informix, должен быть переведены в .Net DateTime. ViewModel - идеальное место для этого перевода и не заставляет вас вводить код перевода во всевозможные нежелательные места.
Одним из атрибутов хорошей конструкции [чего-либо] является возможность замены или изменения часть реализации с небольшим или никаким воздействием на остальные части системы. Но это требует усилий и времени для достижения - вам решать найти практический баланс между идеальным дизайном и дизайном , который достаточно
Но да, есть много других оснований для использования определенных шаблонов, но в нижней строке это:
Ничто не заставляет вас использовать ViewModels ... ASP.NET MVC не заставит вас. Возьмите совет у прагматика внутри вас.
ViewData
и двунаправленные данные ViewModel
. В Model
люди не должны передавать такие вещи, как заголовки HTML-страниц и метаданные.
– Dai
20 January 2013 в 11:39
ViewData
. И ваш код действия контроллера не должен доверять никаким данным, предоставленным пользователем. Сердцем проблемы безопасности Entity-as-ViewModel является автоматическое связывание, предоставляемое каркасом, и веб-приложение, предполагающее, что данные от клиента могут быть доверены, чтобы не перезаписывать чувствительные элементы Entity. Путем ручного заполнения объекта из режима просмотра, при необходимости проверив проверки безопасности, эта проблема предотвращается. – Dai 12 November 2015 в 06:04