web-dev-qa-db-fra.com

return new EmptyResult () VS return NULL

dans ASP.NET MVC lorsque mon action ne retournera rien que j'utilise return new EmptyResult() ou return null

y a-t-il une différence?

58
Artur Keyan

Vous pouvez renvoyer null. MVC le détectera et renverra un EmptyResult.

MSDN: EmptyResult représente un résultat qui ne fait rien, comme une action de contrôleur retournant null

Code source de 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) {
    }
}

Et la source de ControllerActionInvoker qui montre que si vous retournez null, MVC retournera 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;
}

Vous pouvez télécharger le code source du projet Asp.Net MVC sur Codeplex .

72
dknaack

Lorsque vous retournez null d'une action, le framework MVC (en fait la classe ControllerActionInvoker) crée en interne un nouveau EmptyResult. Donc finalement une instance de la classe EmptyResult sera utilisée dans les deux cas. Il n'y a donc pas de réelle différence.

À mon avis, return new EmptyResult() est mieux car il communique plus clairement que votre action ne renvoie rien.

13
nemesv

Artur,

les deux font essentiellement la même chose dans la mesure où l'en-tête http est renvoyé avec une page vierge. vous pouvez cependant l'ajuster davantage si vous le souhaitez et renvoyer un nouveau HttpStatusCodeResult () avec le statusCode et le statusDescription appropriés. c'est à dire.:

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

Je pense que cela peut être une alternative utile.

[edit] - a trouvé une belle implémentation de HttpStatusCodeResult () qui illustre comment tirer parti de cela avec google etc à l'esprit:

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

8
jim tollan