在剃刀mvc 4 rc中清空第一行

er-*_*r-v 8 razor asp.net-mvc-4

我已经从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>
Run Code Online (Sandbox Code Playgroud)

这是我的观点.我的布局只有一行

@RenderBody()
Run Code Online (Sandbox Code Playgroud)

所以在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" ?>
Run Code Online (Sandbox Code Playgroud)

这可行,但这不是我想做的事情.

Phi*_*hil 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到Controller方法?

[ResponseFilter]
public ActionResult Index()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)


小智 6

在尝试返回缓存清单文件时,我在页面顶部遇到类似的问题,并出现空白行.解决方案,添加Response.Write("..."),这将位于页面的第一行.

 @{
     Layout = null;
     Response.Write("CACHE MANIFEST");

} .......
Run Code Online (Sandbox Code Playgroud)


小智 5

我知道这是一个老问题,但是当我寻找这个问题的解决方案时我发现了它。由于没有人有一个简单的解决方案,这是我的:

我能够通过使用部分视图而不是普通视图来解决这个问题。我相信问题归结于布局,即使您将其设置为空,它似乎仍然添加了空白的第一行。@{} 还会显示一个空行,因此您必须将其移至视图底部。

因此,只需添加一个部分视图并让您的控制器返回部分视图,如下所示:

public ActionResult GenerateXML()
{
    return PartialView("_XML");
}
Run Code Online (Sandbox Code Playgroud)

然后在您的部分视图中,您需要像这样进行设置(@{}位于底部):

@model string
<?xml version="1.0" encoding="UTF-8" ?>
<response>
    <message>@Model</message>
</response>
@{ Response.ContentType = "text/xml";}
Run Code Online (Sandbox Code Playgroud)

这将生成以下 HTML 源:

<?xml version="1.0" encoding="UTF-8" ?>
<response>
    <message>Response Message</message>
</response>
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助遇到此问题的其他人。