C# ViewModel是否将创建逻辑计数为;“无异议逻辑”;内部控制器

C# ViewModel是否将创建逻辑计数为;“无异议逻辑”;内部控制器,c#,asp.net,asp.net-mvc,n-layer,C#,Asp.net,Asp.net Mvc,N Layer,那么控制器的下一个示例是否有效?或者像这样的逻辑应该在别的地方? 据我所知,我们需要使用DTO在层之间传输数据,因此如果我们从businesLogic层传递JsonResult或ViewModel,它会出错吗? 那么这个例子就对了,专用于ViewModel创建的逻辑可以在controller中 [HttpPost] [ValidateAntiForgeryToken] public JsonResult UploadImage(HttpPosted

那么
控制器的下一个示例是否有效?或者像这样的逻辑应该在别的地方?
据我所知,我们需要使用
DTO
在层之间传输数据,因此如果我们从
businesLogic
层传递
JsonResult
ViewModel
,它会出错吗? 那么这个例子就对了,专用于
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;
        }
在我看来是正确的

ViewResult和JsonResult都是表示层特有的东西,而不是实际的业务逻辑,因此理所当然地属于控制器

一些额外的(理论上的)思想食粮:从技术上讲,在纯MVC原则下,控制器甚至不应该知道它正在呈现什么样的视图(json或html),而且从技术上讲,该部分应该由另一个MVC操作过滤器处理。但在大多数现实场景中(在.NET世界中),这种模式很少使用,而上面的模式是最常见的(因此我们甚至有JsonResult之类的东西)。因此,这可以说不是很重要。然而,即使您以这种方式构建它,该操作过滤器仍将位于web层(MVC项目),而不是业务层

但是,任何专用于ViewModels的逻辑都应该始终在控制器(“web”/“表示层”)中,而不是在业务层中。业务层甚至不应该知道ViewModels的存在(在理想情况下,业务层将是一个完全不知道Web MVC程序集的独立程序集,甚至看不到这些类)。然后从业务层传回一个“业务对象”(也称为“域”对象),然后将其转换为控制器内的ViewModel(仅特定于演示文稿),并将其传递到视图中