Response content-type will be set as text/html on OutputCache is assigned, even if there is an assignment inside action.
HomeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[OutputCache(Duration = 60)]
public ActionResult NavigationScript()
{
Response.ContentType = "application/javascript";
return View();
}
}
}
Result
Custom a attribute and change content type after output cache processed.
ResponseHeaderAttribute.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace WebApplication1.Filter
{
public class ResponseHeaderAttribute : ActionFilterAttribute
{
public string ContentType { get; set; }
public System.Text.Encoding ContentEncoding { get; set; }
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
if (!string.IsNullOrWhiteSpace(ContentType)) filterContext.HttpContext.Response.ContentType = ContentType;
if (ContentEncoding != null) filterContext.HttpContext.Response.ContentEncoding = ContentEncoding;
}
}
}
HomeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebApplication1.Filter;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[OutputCache(Duration = 60, Order = 1)]
[ResponseHeader(ContentType = "application/javascript", Order = 2)]
public ActionResult NavigationScript()
{
return View();
}
}
}

