Asp.net mvc 在ASP.NET MVC中显式指定控制器返回的ActionResult类型是一种好做法吗

Asp.net mvc 在ASP.NET MVC中显式指定控制器返回的ActionResult类型是一种好做法吗,asp.net-mvc,Asp.net Mvc,我使用ASP.NET MVC已经有一段时间了,似乎发现自己一直在从控制器返回ActionResult以外的内容。我显然返回了ViewResults,但也返回了JSonResults,以及我们内部构建的两个自定义结果 我想知道,如果不声明我的控制器方法,比如: public ActionResult Index() 我应该开始宣布它们为 public ViewResult Index() 或 如果我始终知道控制器上的索引操作将始终返回ViewResult,或者控制器上的搜索操作将始终返回Jso

我使用ASP.NET MVC已经有一段时间了,似乎发现自己一直在从控制器返回ActionResult以外的内容。我显然返回了ViewResults,但也返回了JSonResults,以及我们内部构建的两个自定义结果

我想知道,如果不声明我的控制器方法,比如:

public ActionResult Index()
我应该开始宣布它们为

public ViewResult Index()

如果我始终知道控制器上的索引操作将始终返回ViewResult,或者控制器上的搜索操作将始终返回JsonResult


编辑:我只是想澄清一下,我所说的具体情况是,我总是希望返回特定类型的ActionResult。

我将其保留为通用ActionResult。如果您将其作为特定的结果,并在以后进行更改,则需要重写部分(如果不是全部)单元测试以适应更改。这将使单元测试比需要的更脆弱

编辑:此外,通过将其作为ActionResult保留,您可以根据您的操作逻辑返回各种不同的结果。例如,方法的正常流可能返回重定向结果,但可能有返回ViewResult或HttpUnauthorizedResult的错误路径。如果您键入的方法比最初需要的强度更大,那么在以后添加替代结果时,您可能不得不对其和测试进行不必要的重构


底线是,我没有看到任何真正的优点,至少有一些缺点。

通过声明一个更具体的返回类型,您将获得更多的编译器类型检查,而您现在不必在单元测试中进行这些检查


但是,您将自己绑定到该类型,并且如果该类型发生更改,则必须恢复。一个常见的例子是,如果您必须在某些特殊情况下通过返回重定向结果将用户重定向到其他位置。

我之所以投赞成票,有两个原因

  • 您显式地声明了希望该方法返回的内容,编译器将捕获任何尝试返回的内容。不需要执行断言的单元测试(结果是ViewResult)

  • 在检查结果类型特有的任何属性(例如,检查重定向结果的Url属性)时,必须在测试中将结果强制转换为预期类型。只需将测试变量声明为
    var
    即可消除因更改类型而产生的任何脆性


  • 为什么我的单元测试需要改变?如果我正在测试一个特定的结果类型,我不应该希望在返回结果之外的东西时我的单元测试失败吗?如果我要更改返回类型,我是否也要先更改测试以满足此需求?当您创建单元测试(至少使用MSTest)时,它将为您填写实际结果的结果类型。如果您不去管这些代码,在那些实际上没有检查正确结果类型的测试中——例如,可能要确保发生了DB插入——该测试现在将依赖于结果类型,而不需要这样做。这就是我所说的脆弱。另一方面,如果您重构了测试,以便使用var进行声明,那么这不一定是个问题(我经常这样做)——但您必须记住要这样做。我不知道您的情况,但我的页面直到接近结尾时才真正完成。我总是在这里和那里加一些东西。将自己绑定到特定类型意味着我需要更多的工作。将其保留为ActionResult允许我灵活地将其他类添加到我的FormViewModel中。如果我想返回多个结果类型,那么我同意,我可能应该将其作为操作结果,但是如果期望的行为总是返回特定的操作结果,那么有什么理由我不应该返回特定的操作结果类型吗?我不得不说这对我来说更有意义。
    public JsonResult Search()