我已从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" ?>
这样可行,但这不是我想做的事情。
答案 0 :(得分:6)
临时修复? 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);
}
}
并将其添加到Controller方法中?
[ResponseFilter]
public ActionResult Index()
{
return View();
}
答案 1 :(得分:6)
在尝试返回缓存清单文件时,我遇到了类似的问题,页面顶部有空白行。解决方案,添加Response.Write(“...”),这将位于页面的第一行。
@{
Layout = null;
Response.Write("CACHE MANIFEST");
} .......
答案 2 :(得分:4)
我知道这是一个老问题,但是当我在寻找这个问题的解决方案时,我找到了它。 由于没有人有一个简单的解决方案,这是我的:
我能够通过使用局部视图而不是普通视图来解决这个问题。 我相信问题归结为布局,即使你将它设置为null它仍然似乎添加一个空白的第一行。 @ {}广告也是一个空行,因此您必须将其移至视图的底部。
因此,只需添加局部视图,让控制器返回部分视图:
public ActionResult GenerateXML()
{
return PartialView("_XML");
}
然后在您的局部视图中,您需要像这样设置它(底部有@ {}):
@model string
<?xml version="1.0" encoding="UTF-8" ?>
<response>
<message>@Model</message>
</response>
@{ Response.ContentType = "text/xml";}
这将导致HTML源:
<?xml version="1.0" encoding="UTF-8" ?>
<response>
<message>Response Message</message>
</response>
我希望这能帮助遇到此问题的其他人。
答案 3 :(得分:2)
我知道你建议只将标签移到@{}
的末尾,但为什么不把它放在那之前。此外,这个空白区域是否会导致错误或问题?您可以清楚地看到它是由于您的代码创建的空白而不是来自mvc或razor。
也许是这样的:
@using InvoiceDocflow.Controllers
<?xml version="1.1" encoding="UTF-8" ?>
@{
Response.ContentType = "text/xml";
}
答案 4 :(得分:2)
上述解决方案都没有为我工作,因此花了很长时间试图解决它 - 它应该很容易,因为它只是一个空行 - 我写了一篇关于它的博客文章。
http://devstuffs.wordpress.com/2014/02/07/first-line-empty-in-razor/
答案 5 :(得分:2)
我用这种方式解决了类似的问题:
<强> _ViewStart.cshtml 强>
@{
Layout = null;
Response.Write("<!DOCTYPE html>");
}
另一个.cshtml
@model ViewModel<EshopWebsiteOrder>
<html>
<head>
<meta charset="utf-8" />
最后,在一个地方定义常见的DOCTYPE是有道理的。
答案 6 :(得分:1)
没有ResponseFilter的另一个简单修复。只需将@using放在cshtml文件的底部:
<?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>
@using InvoiceDocflow.Controllers
@{
Response.ContentType = "text/xml";
}
答案 7 :(得分:1)
如果你搬家:
<?xml version="1.1" encoding="UTF-8" ?>
进入布局模板的顶部,然后让你的xml页面继承它并输出你应该工作的xml数据。