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 (который относится только к презентации) внутри вашего контроллера и передает его в вид.