Подтвердить что ты не робот

Return new EmptyResult() VS return NULL

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

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

4b9b3361

Ответ 1

Вы можете вернуть null. MVC обнаружит это и вернет a 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, который показывает, вернули ли вы 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;
}

Вы можете загрузить исходный код проекта Asp.Net Mvc на Codeplex.

Ответ 2

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

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

Ответ 3

Артур,

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

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