ViewModel создает в контроллере счетчик логики как "непредложенную логику"

Так что следующий пример Controller действует? Или такая логика должна быть где-то еще? Как я понимаю, нам нужно использовать DTO для передачи данных между слоями, поэтому, если мы передаем JsonResult или же ViewModel от BussinesLogic слой, это будет ошибка? Тогда этот пример прав, а логика посвящена ViewModel создание может быть в controller?

        [HttpPost]
        [ValidateAntiForgeryToken]
        public JsonResult UploadImage(HttpPostedFileBase file)
        {
            var result = UploadedImageHandler.UploadFile(file);
            JsonResult json;

            if (result != null)
            {
                var uploadImageViewModel = new UploadedImagesViewModel
                {
                    foo = result.foo
                    //here some values from result goes to ViewModel
                };
                var uploadResult = new UploadResultViewModel
                {
                    Preview = new PreviewViewModel 
                    {
                        bar = result.bar 
                        //etc.
                    },
                    UploadedImage = uploadImageViewModel
                };
                json = new JsonResult
                {
                    Data = uploadResult,
                    ContentType = "text/html"
                };
            }
            else
            {
                json = new JsonResult
                {
                    ContentType = "text/html"
                };
            }

            return json;
        }

1 ответ

Решение

Выглядит правильно для меня.

И ViewResult, и JsonResult - это вещи, характерные для уровня представления, а не для реальной бизнес-логики, и, следовательно, они по праву принадлежат контроллеру.

Некоторая дополнительная (теоретическая) пища для размышления: Технически, согласно чистым принципам MVC, контроллер даже не должен знать, какой вид он отображает (json или html), и эта часть технически должна обрабатываться другим MVC. Фильтр действий. Но в большинстве реальных сценариев (в мире.NET) этот вид паттеров используется очень редко, и то, что у вас есть выше, является наиболее распространенным (поэтому у нас даже есть такие вещи, как JsonResult и т. Д.). Так что это возможно не очень важно. Однако даже если бы вы разработали его таким образом, этот фильтр действий все равно был бы на веб-уровне (проект MVC), а не на бизнес-уровне.

Но да, любая логика, предназначенная для ViewModels, всегда должна быть в контроллере ("веб"/ уровень представления) и никогда не на бизнес уровне. Бизнес-уровень даже не должен знать о существовании ViewModels (в идеальном случае бизнес-уровень - это отдельная сборка, совершенно не подозревающая о вашей Web-сборке MVC, и даже не увидит эти классы). На бизнес-уровне вы затем передаете обратно "бизнес-объект" (также известный как "домен"), который затем преобразуете в ViewModel (который относится только к презентации) внутри вашего контроллера и передает его в вид.

Другие вопросы по тегам