返回void的ASP.Net MVC控制器操作

72
如果我有以下控制器操作...
public void DoSomething()
{
}

这个框架会实际将它转换成这样吗?

public EmptyResult DoSomething()
{
  return new EmptyResult();
}
3个回答

81

好的,所以它正在使用 Null 对象模式。 - Chris Arnold

3

看起来是这样的,请查看ControllerActionInvoker.cs的源代码。我没有验证过,但逻辑告诉我,void返回将会将actionReturnValue设置为null,因此会生成一个EmptyResult。这是最新的源代码,我还没有检查ASP.net MVC 1.0的源代码。

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;
}

1

它不会“转换”它,但对于用户而言,两者的效果是相同的。请求将被发送,但没有响应将返回到客户端。

个人认为,即使您只是直接向响应流写入继续或成功,您也需要向客户端发送一些响应。即使是JSON true或空XML文档也比什么都没有要好。


1
为什么这里会有踩?以理性的名义反驳;关于始终返回某些内容的观点非常好。 - ProfK
9
我猜测被踩的原因是因为会有回应。回应是200 OK,但是回应体为空。我认为在ajax操作中,使用HTTP状态码来传达操作结果是合理的,如200 OK,500错误,403禁止等。并不总是需要一个正文。 - MarkPflug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接