web-dev-qa-db-ja.com

新しいEmptyResult()を返すVS NULLを返す

aSP.NET MVCで、アクションが何も返さない場合、return new EmptyResult()またはreturn null

違いはありますか?

58
Artur Keyan

nullを返すことができます。 MVCはそれを検出し、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) {
    }
}

また、nullを返すかどうかを示すControllerActionInvokerからのソース、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;
}

Asp.Net MVCプロジェクトのソースコードは Codeplex でダウンロードできます。

72
dknaack

アクションからnullを返すと、MVCフレームワーク(実際にはControllerActionInvokerクラス)が内部で新しいEmptyResultを作成します。最後に、両方のケースでEmptyResultクラスのインスタンスが使用されます。したがって、実際の違いはありません。

私の意見では、return new EmptyResult()はあなたのアクションが何も返さないことをより明確に伝えるため、より良いです。

13
nemesv

アルトゥール、

どちらも基本的に同じで、httpヘッダーが空白ページとともに返送されます。ただし、必要に応じてさらに微調整して、適切なstatusCodeとstatusDescriptionで新しいHttpStatusCodeResult()を返すこともできます。すなわち:

var result = new HttpStatusCodeResult(999, "this didn't work as planned");
return result;

これは有用な代替手段になると思います。

[編集]-googleなどを念頭に置いてこれを活用する方法を例示するHttpStatusCodeResult()のニース実装を見つけました。

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

8
jim tollan