返回new EmptyResult()VS返回NULL

Art*_*yan 59 asp.net-mvc action asp.net-mvc-3

在ASP.NET MVC的时候我的行动将不会返回任何东西我使用return new EmptyResult()return null

有什么不同吗?

dkn*_*ack 74

你可以回来null.MVC将检测到并返回a EmptyResult.

MSDN:EmptyResult表示不执行任何操作的结果,例如返回null的控制器操作

mvc的源代码.

public class EmptyResult : ActionResult {

    private static readonly EmptyResult _singleton = new EmptyResult();

    internal static EmptyResult Instance {
        get {
            return _singleton;
        }
    }

    public override void ExecuteResult(ControllerContext context) {
    }
}
Run Code Online (Sandbox Code Playgroud)

来自ControllerActionInvokerwich 的源显示如果你返回null,MVC将返回EmptyResult.

protected virtual ActionResult CreateActionResult(ControllerContext controllerContext, ActionDescriptor actionDescriptor, object actionReturnValue) {
    if (actionReturnValue == null) {
        return new EmptyResult();
    }

    ActionResult actionResult = (actionReturnValue as ActionResult) ??
        new ContentResult { Content = Convert.ToString(actionReturnValue, CultureInfo.InvariantCulture) };
    return actionResult;
}
Run Code Online (Sandbox Code Playgroud)

您可以在Codeplex上下载Asp.Net Mvc项目的源代码.

  • 什么是内部单身人士? (6认同)

nem*_*esv 13

当你null从一个动作返回时,MVC框架(实际上是ControllerActionInvoker类)将在内部创建一个新的EmptyResult.所以最后EmptyResult在这两种情况下都会使用该类的实例.所以没有真正的区别.

我个人认为return new EmptyResult()更好,因为它更清楚地表明你的行为没有回报.


jim*_*lan 8

阿图尔,

两者基本相同,因为http标头与空白页一起发回.但是,如果您愿意,可以进一步调整并返回具有相应statusCode和statusDescription的新HttpStatusCodeResult().即:

var result = new HttpStatusCodeResult(999, "this didn't work as planned");
return result;
Run Code Online (Sandbox Code Playgroud)

我认为这可能是一个有用的选择.

[编辑] - 找到了一个很好的HttpStatusCodeResult()实现,它体现了如何在谷歌等中充分利用它:

http://weblogs.asp.net/gunnarpeipman/archive/2010/07/28/asp-net-mvc-3-using-httpstatuscoderesult.aspx