关于这个问题,我一直找不到一个具体的答案。我看过this there和其他地方的帖子和后续帖子,但我真正读到的是JsonResult有一种硬编码的内容类型,并且真的没有任何性能提升。
如果两个结果都可以返回Json,那么为什么需要使用JsonResult而不是ActionResult。
public ActionResult()
{
return Json(foo)
}
public JsonResult()
{
return Json(bar)
}
有没有人能解释一下这样一种场景: ActionResult根本无法完成工作,而必须使用JsonResult 。如果不是,为什么JsonResult首先会存在。
发布于 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。
public abstract class ActionResult
{
public abstract void ExecuteResult(ControllerContext context);
}
此方法由ControllerActionInvoker
调用,并实现向response
对象写入数据的逻辑。
ControllerActionInvoker
不知道具体的结果,因此它可以处理从ActionResult
ExecuteResult
.派生并实现的任何结果
在这两种情况下,您都会在示例中返回一个JsonResult
类型的实例,而Json(model)
只是一个创建JsonResult
实例的工厂方法。
还有另一个,所以where ,其中讨论了方法参数和返回值的最佳实践。
一般的想法是是,提供抽象类型作为参数,这样你的方法就可以处理更大范围的参数;返回足够具体的类型,这样你的客户就不需要强制转换或转换它们。
发布于 2014-10-16 03:56:46
您可能已经注意到,MVC控制器中所有常见返回类型的名称都以“ActionResult”结尾,而且大多数操作通常都会返回一个结果。如果您查看documentation,您可以看到从抽象类ActionResult继承的几个更具体化的结果类型。因此,您现在可以在所有操作中返回ActionResult,甚至可以返回不同的类型。示例:
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,可能是为了可读性,也可能是出于其他个人喜好。
发布于 2014-10-21 14:53:38
它只是遵循了简单的多态性原则。
通过将方法签名定义为返回抽象ActionResult
,它是JsonResult
、ViewResult
、ContentResult
(和其他)的基类型,您可以通过让操作的implementation决定返回哪个ActionResult
来返回上述任何类型。
例如:
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<>
使用情况:
public static IEnumerable<T> Where<T>
(
this IEnumerable<T> source,
Func<T, bool> predicate
);
Where()
方法被声明为返回IEnumerable<T>
,这样您就可以对实现IEnumerable<T>
接口的任何类型调用该方法,无论是Array
、List
、HashSet
还是Dictionary
。
https://stackoverflow.com/questions/26390806
复制相似问题