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>

これが私の見解です。私のレイアウトは1行だけです

@RenderBody()

そのため、mvc 3<?xml version="1.1" encoding="UTF-8" ?>では最初の行に表示されていましたが、現在は 2 行目に表示され、最初の行は空のままになっています。

ここに画像の説明を入力

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

私はこの方法で同様の問題を解決しました:

_ViewStart.cshtml

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

別の .cshtml

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

最後に、共通の DOCTYPE を 1 か所で定義することは理にかなっています。

于 2015-08-05T12:11:22.413 に答える
1

ResponseFilter を使用しない別の簡単な修正。cshtml ファイルの末尾に @using を追加するだけです。

<?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 に答える