8

我已经从 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" ?>

这会起作用,但这根本不是我想做的。

4

8 回答 8

7

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

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

} .......
于 2014-09-23T19:49:51.677 回答
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();
}
于 2012-07-13T12:32:07.057 回答
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>

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

于 2014-10-01T23:09:06.657 回答
2

我知道您建议将标签移到末尾,@{}但为什么不在此之前放置。此外,这个空白是否会导致错误或问题?您可以清楚地看到这是因为您的代码创建的空白,而不是来自 mvc 或 razor。

也许是这样的:

@using InvoiceDocflow.Controllers
<?xml version="1.1" encoding="UTF-8" ?>
@{
 Response.ContentType = "text/xml";
}
于 2012-07-16T22:33:53.543 回答
2

上面的解决方案都不适合我,所以在花了很长时间试图修复它之后——它应该很容易,因为它只是一个空行——我写了一篇关于它的博客文章。

http://devstuffs.wordpress.com/2014/02/07/first-line-empty-in-razor/

于 2014-02-07T19:25:07.740 回答
2

我以这种方式解决了类似的问题:

_ViewStart.cshtml

@{
    Layout = null;
    Response.Write("<!DOCTYPE html>");
}

另一个.cshtml

@model ViewModel<EshopWebsiteOrder>
<html>
<head>
    <meta charset="utf-8" />

最后,在一个地方定义通用 DOCTYPE 是有意义的。

于 2015-08-05T12:11:22.413 回答
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";
}
于 2012-08-31T17:13:19.630 回答
1

如果你搬家:

<?xml version="1.1" encoding="UTF-8" ?>

进入布局模板的顶部,然后让您的 xml 页面继承它并输出它应该工作的 xml 数据。

于 2014-03-13T08:20:57.613 回答