我目前在遗留的asp.net mvc 1应用程序中存在问题,在控制器上的POST操作中,响应中的内容类型标头丢失
Cache-Control:private
Date:Thu, 16 Jan 2014 10:43:52 GMT
Server:Microsoft-IIS/7.5
Set-Cookie:cartguid=; expires=Mon, 16-Dec-2013 10:43:53 GMT; path=/; HttpOnly
Transfer-Encoding:chunked
这通常不是问题,但我们现在将Apache反向代理放在Web服务器的前面 - 当没有从下游应用程序定义的内容类型时,mod_rewrite / mod_proxy将内容类型默认为text / plain
因此,虽然我们正在考虑Apache方面的配置选项(我们在反向代理后面有其他应用程序,但我们注意到我们在尝试修复此问题时不会破坏别的东西),我会想知道从应用程序/ MVC的角度来看会有什么选择。我端的代码有以下签名
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult ProcessForm(FormCollection form, Model model)
{
// code here
return View("~/Views/viewpage.aspx");
}
我到目前为止尝试做的是在viewpage.aspx的标题中添加这段代码
<% HttpContext.Current.Response.AppendHeader("Content-Type", "text/html"); %>
但它没有效果。还更新了代码,只是将视图返回到RedirectToAction
,但在设置内容类型方面也没有任何区别
答案 0 :(得分:0)
不确定它是否可用/适用于MVC1
您可能想尝试返回ContentResult而不是查看。您可以为ActionResult过滤器指定内容类型。
public static string RenderViewAsString(string viewName, object model,
ControllerContext controllerContext, ViewDataDictionary viewData, TempDataDictionary tempData)
{
viewData.Model = model;
using (var stringWriter = new StringWriter())
{
var result = ViewEngines.Engines.FindPartialView(controllerContext, viewName);
result.View.Render(
new ViewContext(controllerContext, result.View, viewData, tempData, stringWriter),
stringWriter);
return stringWriter.GetStringBuilder().ToString();
}
}
然后
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult ProcessForm(FormCollection form, Model model)
{
// code here
var resultAsString = RenderViewAsString("~/Views/viewpage.aspx", null, ControllerContext, ViewData, TempData);
return Content(resultAsString, "text/html");
}