it-swarm-pt.tech

retornar novo EmptyResult () VS retornar NULL

no ASP.NET MVC quando minha ação não retornará nada que eu use return new EmptyResult() ou return null

existe alguma diferença?

58
Artur Keyan

Você pode retornar null. O MVC detectará isso e retornará um EmptyResult.

MSDN: EmptyResult representa um resultado que não faz nada, como uma ação do controlador retornando nulo

Código fonte do 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) {
    }
}

E a fonte de ControllerActionInvoker que mostra se você retornar nulo, o MVC retornará 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;
}

Você pode fazer o download do código-fonte do projeto Asp.Net MVC em Codeplex .

72
dknaack

Quando você retorna null de uma ação, a estrutura MVC (na verdade, a classe ControllerActionInvoker) cria internamente um novo EmptyResult. Então, finalmente, uma instância da classe EmptyResult será usada nos dois casos. Portanto, não há diferença real.

Na minha opinião pessoal, return new EmptyResult() é melhor porque comunica mais claramente que sua ação não retorna nada.

13
nemesv

Artur,

ambos fazem basicamente o mesmo, pois o cabeçalho http é enviado de volta com uma página em branco. você pode, no entanto, ajustar ainda mais se desejar e retornar um novo HttpStatusCodeResult () com o statusCode e statusDescription apropriados. ou seja:

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

Eu acho que pode ser uma alternativa útil.

[edit] - encontrou uma boa implementação de HttpStatusCodeResult (), que exemplifica como alavancar isso com o google etc em mente:

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

8
jim tollan