我已经从mvc 3迁移到mvc 4并遇到了以下问题.
@using InvoiceDocflow.Controllers @{ Response.ContentType = "text/xml"; } <?xml version="1.1" encoding="UTF-8" ?> <dc> @foreach (var dcLink in (IEnumerable<DcLink>)ViewData["SupportedDcs"]) { <link rel="@dcLink.RelUri.ToString()" href="@dcLink.DcUri.ToString()" /> } </dc>
这是我的观点.我的布局只有一行
@RenderBody()
所以在mvc 3<?xml version =“1.1”encoding =“UTF-8”?>出现在第一行,但现在,它出现在第二行,第一行留空.
我可以在第一行渲染它,因为它在mvc 3中吗?
顺便说说.
@using InvoiceDocflow.Controllers @{ Response.ContentType = "text/xml"; }<?xml version="1.1" encoding="UTF-8" ?>
这可行,但这不是我想做的事情.
解决方法
临时修复? ActionFilter并删除空的第一行?显然,如果合适,您还可以对响应进行其他缩小.
public class TranslationFilter : MemoryStream { private Stream filter = null; public TranslationFilter(HttpResponseBase httpResponseBase) { filter = httpResponseBase.Filter; } public override void Write(byte[] buffer,int offset,int count) { var response = UTF8Encoding.UTF8.GetString(buffer); // remove all newlines response = response.Replace(System.Environment.NewLine,""); /* remove just first empty line if (response.Substring(0,2) == "\r\n") { response = response.Substring(2,response.Length - 2); } */ filter.Write(UTF8Encoding.UTF8.GetBytes(response),offset,UTF8Encoding.UTF8.GetByteCount(response)); } } public class ResponseFilter : ActionFilterAttribute { public ResponseFilter() { } public override void OnResultExecuted(ResultExecutedContext filterContext) { base.OnResultExecuted(filterContext); filterContext.HttpContext.Response.Filter = new TranslationFilter(filterContext.HttpContext.Response); } }
[ResponseFilter] public ActionResult Index() { return View(); }