作为ASP.NET MVC的新手,我一直想知道Controller方法的签名。在我看到的所有示例中,它们似乎总是返回ActionResult,即使它们实际返回ViewResult实例或类似实例。

这是一个常见的例子:

public ActionResult Index()
{
    return this.View();
}

在这种情况下,将方法声明为 public ViewResult Index()并获得更强大的类型支持会不会更有意义吗?

实验表明这是有效的,所以似乎有可能。

我确实意识到可能存在需要多态的情况(例如,如果您只想在某些情况下重定向,但在其他情况下显示视图),但是如果方法总是返回一个观点,我发现ViewResult更令人满意。

就未来兼容性而言,ActionResult显然提供了更强大的签名,但是如果一个人控制整个代码库,那么总是可以将方法的签名更改为更通用的返回类型,如果将来有必要的话。 / p>

是否有其他我不了解的注意事项,或者我应该继续并使用特定的返回类型声明我的控制器方法?

其他提示

始终返回您可以返回的最准确类型。因此,当操作始终显示视图时,您应该返回ViewResult。在某些情况下(在无效的发布数据中)返回ViewResult或在其他情况下返回RedirectToRouteResult时,我只会使用ActionResult。

使用一些高级的actionfilter /执行方案,你甚至可以返回与ActionResult无关的完全不同的东西。

是的,您可以定义您的操作: 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”中)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top