ContentResult vs. string

If you return something other than an ActionResult the default behavior is to create a ContentResult wrapping the result of calling ToString() on whatever you did return (or EmptyResult if you returned null). Reasons I can think of to explicitly return ContentResult:

  • It reinforces the fact that the method is an action, rather than a regular method, so devs are less likely to make mistakes like casually renaming it.
  • If in the future you need to specify the content-type you won't need to change the method signature.
  • It doesn't hide the ToString() call. This doesn't matter if you're returning string, but returning a complex type could have unexpected results.

Two main advantages:

  • You can specify the content encoding via the ContentEncoding property
  • You can specify the content type (ie, 'text/html') via the ContentType property

Also, if you want to be OO-clean about it, ContentResult, along with all ActionResult derived classes follow the Command Pattern by providing an ExecuteResult command for the MVC pipeline to run.

UPDATE: 19-Nov-2020 The original Command Pattern link (dead link) was no longer working so I updated it to reference a similar Microsoft document. Also, to see a great explanation on the Command Pattern, view this link.


You can't return a string on a method which returns an ActionResult, so this is when you could use a ContentResult to return a plain string like so:

public ContentResult Hello()
{
    return Content("hello world!");
}

ContentResult by default returns a type of text/plain. If you only ever needed to return a string, then you would use the method to return a string