ASP.NET MVC控制器方法必须返回ActionResult吗?
-
06-07-2019 - |
题
作为ASP.NET MVC的新手,我一直想知道Controller方法的签名。在我看到的所有示例中,它们似乎总是返回ActionResult,即使它们实际返回ViewResult实例或类似实例。
这是一个常见的例子:
public ActionResult Index()
{
return this.View();
}
在这种情况下,将方法声明为 public ViewResult Index()
并获得更强大的类型支持会不会更有意义吗?
实验表明这是有效的,所以似乎有可能。
我确实意识到可能存在需要多态的情况(例如,如果您只想在某些情况下重定向,但在其他情况下显示视图),但是如果方法总是返回一个观点,我发现ViewResult更令人满意。
就未来兼容性而言,ActionResult显然提供了更强大的签名,但是如果一个人控制整个代码库,那么总是可以将方法的签名更改为更通用的返回类型,如果将来有必要的话。 / p>
是否有其他我不了解的注意事项,或者我应该继续并使用特定的返回类型声明我的控制器方法?
解决方案
您绝对可以使用特定的返回类型,即使网络上的大多数示例似乎都返回 ActionResult 。我唯一一次返回 ActionResult 类是当action方法的不同路径返回不同的子类型时。
史蒂文桑德森还建议在他的书中回复特定类型 Pro ASP.NET MVC Framework 一>。看看下面的引用:
"此操作方法专门声明它返回ViewResult的实例。如果方法返回类型是ActionResult(所有操作结果的基类),它将工作相同。事实上,一些ASP.NET MVC程序员声明他们所有的动作方法都返回一个非特定的ActionResult,即使他们确定它总会返回一个特定的子类。但是,在面向对象编程中,一个公认的原则是方法应该返回它们可以使用的最具体的类型(以及接受它们可以使用的最通用的参数类型)。遵循此原则可以最大限度地提高调用方法的代码的便利性和灵活性,例如单元测试。“
其他提示
始终返回您可以返回的最准确类型。因此,当操作始终显示视图时,您应该返回ViewResult。在某些情况下(在无效的发布数据中)返回ViewResult或在其他情况下返回RedirectToRouteResult时,我只会使用ActionResult。
使用一些高级的actionfilter /执行方案,你甚至可以返回与ActionResult无关的完全不同的东西。
[部分答案]:你并不总是返回ActionResult,不。以下是您可以返回的其他一些结果的快速视图: http://msdn.microsoft.com/en-us/library/dd410269%28v=vs.98%29.aspx
也许这会有所帮助。祝你好运!
是的,您可以定义您的操作: public ViewResult Index()
。但有时你的动作可以返回不同的结果(如果不将结果声明为base ActionResult
类,则不可能)。例如:
public ActionResult Show()
{
...
if(Request.IsAjaxRequest())
{
return PartialView(...);
}
return View(...);
}
或:
public ActionResult Show()
{
...
try
{
...
}
catch(Exception)
{
return RedirectToAction(...);
}
return View(...);
}
ActionResult是各种返回类型的基类。因此,您的操作必须返回ActionResult 或从其派生的类才能工作。常见的是 ViewResult
, JsonResult
等。
是的,我有桑德森的书,我喜欢那部分是关于具体的,因为当我查看其他控制器动作示例时,这让我很烦恼。我的哲学甚至b4学习MVC是因为函数(返回值的方法)应当被视为在相同类型的变量/ ref的上下文中声明变量/可替换,具体关于类型,就像你一样如果声明一个var(想到它想要避免将所有变量定义为类型“对象”在应用程序中 - 更强大,但你失去了一些设计时检查和类型安全)。便于控制器单元测试正确的返回类型。
如需相关参考,请查看Listkov的替代原则(“L”在“SOLID”中)。