首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时通过ActionResult使用JsonResult

何时通过ActionResult使用JsonResult
EN

Stack Overflow用户
提问于 2014-10-16 03:46:14
回答 4查看 21.5K关注 0票数 22

关于这个问题,我一直找不到一个具体的答案。我看过this there和其他地方的帖子和后续帖子,但我真正读到的是JsonResult有一种硬编码的内容类型,并且真的没有任何性能提升。

如果两个结果都可以返回Json,那么为什么需要使用JsonResult而不是ActionResult。

代码语言:javascript
复制
public ActionResult()
{
    return Json(foo)
}

public JsonResult()
{
    return Json(bar)
}

有没有人能解释一下这样一种场景: ActionResult根本无法完成工作,而必须使用JsonResult 。如果不是,为什么JsonResult首先会存在。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-22 02:10:50

何时通过ActionResult使用JsonResult

我通常会返回具体的结果(例如,JsonResult**,** ViewResult**) my pros:**

,因此将ViewResult和指定为结果类型时,使用分部视图或共享视图会更容易

这里有一些人们支持这种方法的链接:

这里引用了Pro ASP.NET MVC 3 Framework的一句话

注意,清单中操作方法的返回类型是ViewResult。如果我们指定了更通用的ActionResult类型,那么该方法也可以很好地编译和工作。事实上,一些MVC程序员会将每个动作方法的结果定义为ActionResult,即使他们知道它总是会返回一个更具体的类型。我们在下面的示例中特别努力地进行了这种实践,以清楚地说明如何使用每种结果类型,但在实际项目中,我们倾向于更加轻松。

只有当一个操作应该返回不同类型的结果时,我才会使用 ActionResult ,而不是具体的一个。,但这不是常见的情况。

我还想补充说,ActionResult是一个抽象类,所以您不能简单地创建此类型的实例并返回它。JsonResult是具体的,因此您可以创建它的实例并从操作方法返回。There are many other types that derived from ActionResult,基本上它们都是used to override ExecuteResult method

代码语言:javascript
复制
public abstract class ActionResult
{
    public abstract void ExecuteResult(ControllerContext context);
} 

此方法由ControllerActionInvoker调用,并实现向response对象写入数据的逻辑。

ControllerActionInvoker不知道具体的结果,因此它可以处理从ActionResult ExecuteResult.派生并实现的任何结果

在这两种情况下,您都会在示例中返回一个JsonResult类型的实例,而Json(model)只是一个创建JsonResult实例的工厂方法。

还有另一个,所以where ,其中讨论了方法参数和返回值的最佳实践。

一般的想法是是,提供抽象类型作为参数,这样你的方法就可以处理更大范围的参数;返回足够具体的类型,这样你的客户就不需要强制转换或转换它们。

票数 21
EN

Stack Overflow用户

发布于 2014-10-16 03:56:46

您可能已经注意到,MVC控制器中所有常见返回类型的名称都以“ActionResult”结尾,而且大多数操作通常都会返回一个结果。如果您查看documentation,您可以看到从抽象类ActionResult继承的几个更具体化的结果类型。因此,您现在可以在所有操作中返回ActionResult,甚至可以返回不同的类型。示例:

代码语言:javascript
复制
public ActionResult View(int id)
{
    var result = _repository.Find(id);
    if(result == null)
        return HttpNotFound(); //HttpNotFoundResult, which inherits from HttpStatusCodeResult
    return View(result); //ViewResult
}

所有这些都使得根据请求返回不同的内容变得更容易。那么为什么要使用JsonResult而不是ActionResult呢?也许这样就没有误解了,您实际上只能返回JSON,可能是为了可读性,也可能是出于其他个人喜好。

票数 4
EN

Stack Overflow用户

发布于 2014-10-21 14:53:38

它只是遵循了简单的多态性原则。

通过将方法签名定义为返回抽象ActionResult,它是JsonResultViewResultContentResult (和其他)的基类型,您可以通过让操作的implementation决定返回哪个ActionResult来返回上述任何类型。

例如:

代码语言:javascript
复制
public ActionResult GetData(int id)
{
     var data = .... // some data

     if (Request.AcceptTypes.Contains("json"))
          return Json(data);
     else
          return View(data);
}

实际上,将方法的返回类型定义为尽可能抽象是OOP中的一种常见做法。您也可以在Linq中找到它,例如.NET中的IEnumerable<>使用情况:

代码语言:javascript
复制
public static IEnumerable<T> Where<T>
                       (
                       this IEnumerable<T> source,
                       Func<T, bool> predicate
                       );

Where()方法被声明为返回IEnumerable<T>,这样您就可以对实现IEnumerable<T>接口的任何类型调用该方法,无论是ArrayListHashSet还是Dictionary

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26390806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档