【问题标题】:Visual Studio 2015: MVC 6 Scaffolding switched to using IActionResult intead of ActionResultVisual Studio 2015:MVC 6 脚手架切换到使用 IActionResult 而不是 ActionResult
【发布时间】:2015-07-31 00:42:51
【问题描述】:

我刚刚安装了 VS 2015,我注意到 MVC6 的自动脚手架发生了一些变化。我很好奇微软为什么做出这些改变,因为我认为如果他们决定做一些改变,可能会有一些我可能不知道的好处。

在 VS 2013 中,始终使用 MVC 5 Auto-Scaffolding:ActionResult

在 VS 2015 中,MVC 6 Auto-Scaffolding 切换到使用:IActionResult

在 VS 2015 中,我注意到微软团队不想再这样做了:

 public class Test{
     private int i;
     public Test (int i){
         this.i = i;
     }
 }

虽然在所有生成的类中我都看到了它们:

 public class Test{
     private int _i;
     public Test (int i){
         _i = i;
     }
 }

如果只是编码风格的问题,那我会立即失去兴趣,不知道他们为什么改变了这一点,但如果这背后有任何合乎逻辑的解释,我迫不及待想知道那是什么。

【问题讨论】:

  • 不确定您的Test 问题,但至于ActionResultIActionresult - 我认为它们遵循约定并且IActionResult 是一个接口.. 所以你获得了编码的所有优势到一个接口而不是一个类 - 即能够更改返回类型而不知道它是什么直到运行时。例如 JsonResult 实现了 IActionResult - 然后你可以搭建与上面相同的代码,但可以轻松地将返回类型从 ActionResult 更改为 JsonResult 而无需更改方法签名。
  • 他们将 actionresult 抽象出来,因此没有具体的实现,因此您可以使用任何类,只要它继承自 IActionresult 接口
  • 我相信这是 2 个问题。第一个是关于 IActionResult 的,第二个是关于私有变量命名约定的。你应该把它分开。
  • 两个 Test 类产生相同的 CLR 代码(除了元数据说“有一个名为 _i 的字段”而不是“有一个名为 i 的字段”)。虽然更改微不足道,但我喜欢它——下划线约定消除了许多难以检测到的错误,其中您有 i = value 但需要 this.i = value

标签: c# asp.net-mvc visual-studio-2015 asp.net-core-mvc


【解决方案1】:

就您的 ActionResult 问题而言,在以前的 ASP.NET 中,MVC 控制器使用 System.Web.MVC.Controller 父类,而 Web API 控制器使用 System.Web.Http.ApiController 父类。

但在 ASP.NET 5 MVC 6 中,它们已将两者合并到一个 Web 应用程序中。所以现在只有 1 个控制器类 Microsoft.AspNet.Mvc.Controller 类作为它们的基础。 现在来区分它们,当用作 MVC 控制器时,IActionResult 可能是一个视图。当用作 Web API 控制器时,IActionResult 可能是数据 (JSON/XML)。同一个控制器可能具有返回视图和数据的操作。

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 2011-06-30
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2018-08-30
    • 2022-08-11
    相关资源
    最近更新 更多