вернуть новый EmptyResult () VS вернуть NULL - PullRequest
58 голосов
/ 19 декабря 2011

в ASP.NET MVC, когда мои действия не вернут ничего, что я использую return new EmptyResult() или return null

есть ли разница?

Ответы [ 3 ]

72 голосов
/ 19 декабря 2011

Вы можете вернуть null. MVC обнаружит это и выдаст EmptyResult.

MSDN: EmptyResult представляет результат, который ничего не делает, как действие контроллера, возвращающее нуль

Исходный код 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) {
    }
}

И источник из 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 .

13 голосов
/ 19 декабря 2011

Когда вы возвращаете null из действия, среда MVC (фактически класс ControllerActionInvoker) внутренне создаст новый EmptyResult. Наконец, экземпляр класса EmptyResult будет использоваться в обоих случаях. Так что нет никакой разницы.

По моему личному мнению return new EmptyResult() лучше, потому что он более четко сообщает, что ваши действия ничего не возвращают.

8 голосов
/ 19 декабря 2011

Артур

оба делают в основном одно и то же, поскольку заголовок http отправляется обратно вместе с пустой страницей. вы можете, однако, настроить это дальше, если хотите, и вернуть новый HttpStatusCodeResult () с соответствующими statusCode и statusDescription. i.e.:

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

Я думаю, что это может быть полезной альтернативой.

[edit] - найдена хорошая реализация HttpStatusCodeResult (), которая иллюстрирует, как использовать это с учетом Google и т. Д .:

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

...