razor mvc 4 rc中的第一行为空

razor mvc 4 rc中的第一行为空,razor,asp.net-mvc-4,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"]) {

我已经从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>
因此,在mvc 3中,
出现在第一行,但现在,它出现在第二行,第一行留空

我可以让它像在MVC3中一样在第一行渲染吗

顺便说一下

@using InvoiceDocflow.Controllers
@{
    Response.ContentType = "text/xml";
}<?xml version="1.1" encoding="UTF-8" ?>
@使用InvoiceDocflow.Controllers
@{
Response.ContentType=“text/xml”;
}

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

临时修复?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();
}

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

也许是这样的:

@using InvoiceDocflow.Controllers
<?xml version="1.1" encoding="UTF-8" ?>
@{
 Response.ContentType = "text/xml";
}
@使用InvoiceDocflow.Controllers
@{
Response.ContentType=“text/xml”;
}

另一个没有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";
}

@foreach(在(IEnumerable)ViewData[“SupportedDcs”]中的变量dcLink)
{
}
@使用InvoiceDocflow.Controllers
@{
Response.ContentType=“text/xml”;
}

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

如果您移动:

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


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

在尝试返回缓存清单文件时,我遇到了页面顶部空行的类似问题。解决方案,添加一个响应。写(“…”),这将在页面的第一行

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

} .......

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

我可以通过使用局部视图而不是普通视图来修复此问题。 我相信问题可以归结为布局,即使将其设置为null,似乎仍然会添加一个空白的第一行。@{}也会显示一个空行,因此您必须将其移动到视图的底部

因此,只需添加一个局部视图,并让控制器返回该局部视图:

public ActionResult GenerateXML()
{
    return PartialView("_XML");
}
然后在您的局部视图中,您将需要这样设置它(在底部有您的@{}):

@模型字符串
@模型
@{Response.ContentType=“text/xml”;}
这将产生以下HTML源:

<?xml version="1.0" encoding="UTF-8" ?>
<response>
    <message>Response Message</message>
</response>

响应消息

我希望这能帮助其他遇到这个问题的人。

我用这种方法解决了类似的问题:

\u ViewStart.cshtml

@{
    Layout = null;
    Response.Write("<!DOCTYPE html>");
}
@model ViewModel<EshopWebsiteOrder>
<html>
<head>
    <meta charset="utf-8" />
@{
布局=空;
回答。写(“”);
}
另一个.cshtml

@{
    Layout = null;
    Response.Write("<!DOCTYPE html>");
}
@model ViewModel<EshopWebsiteOrder>
<html>
<head>
    <meta charset="utf-8" />
@model视图模型

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

我在Mvc4行为中没有看到任何bsd:它会在页面中复制代码块之外的所有cariage返回,因此如果您不想使用回车符,就必须输入我不需要代码块来隐式影响输出。这是错误的。在MVC3中这是正常的。关键是回车符在代码块之外,所以它会在输出中报告。虽然Vb是面向行的,但C#不是。很明显,tham Mvc 4对代码块的定义与Mvc3不同。但是我不认为可以说Mvc 4的定义“错误”…只是不同。为什么不使用自定义操作结果来生成XML?在视图中手动创建XML而不是使用XML解析器是非常危险的。这不是完整的解决方案。每一个@{}块上都会出现新行(不仅仅是第一个),所以我更喜欢它能处理的解决方案。但,若并没有其他选择的话,我会接受你们的问题。调整为删除所有新行,但显然这可能不是你们想要的——这使得在浏览器中阅读html源代码变得更加困难。很高兴我能帮上忙。这不是要删除所有新行。它是关于删除由@{}块组成的行的。我相信这个bug是在或中的某个地方。任何人都可以发送带更正的请求吗?“解决方案2”工作得很好(我正在生成一个缓存清单文件)。谢谢分享!evanswd在评论中的建议对我来说很好,而且非常简单!请在回答中插入解决方案的摘要,或将此链接转换为评论。这个未得到充分赞赏的答案对我很有用。XML文件的doctype必须位于第一行,且不带任何前导空格。@{}部分在页面上的任何其他部分之前执行。因此,Response.Write()也将在Razor在页面内容前面添加前导的无关空格之前执行。正如其他一些答案所建议的那样,将doctype移动到视图的顶部并没有解决问题。