2012-07-04 11 views
8

mvc 3からmvc 4に移行し、次の問題が発生しました。razor mvcの空の最初の行4 rc

@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 <?xml version="1.1" encoding="UTF-8" ?>

@RenderBody() 

だから、最初の行に登場しただけで1行ですが、今、目の最初の行を残して2行目にその現れ、空。

enter image description here

私はそれがMVC 3であったように、それは最初の行にレンダリングすることはできますか?

ところで、

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

これはうまくいくが、これは私が何をしたいかではない。

+0

私はMvc4の動作にbsdが何も表示されません。ページ内にコードブロックの外にあるすべての冗長なリターンをコピーします。したがって、キャリッジリターンを必要としない場合は、<?xml .. ...同じ行に。これには何が問題なのですか? –

+0

暗黙的に出力に影響を与えるコードブロックは必要ありません。それは間違っている。 MVC 3では問題ありませんでした。 –

+0

キャリッジリターンはコードブロックから外れているため、アウトパントで報告されます。 Vbは行指向のC#ではありません。 Mvc 4はMvc3よりもコードブロックの定義が異なることは明らかですが、Mvc 4の定義が「間違っている」と言うことはできません。 –

答えて

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); 
    } 
} 

コントローラメソッドに追加しますか?

[ResponseFilter] 
public ActionResult Index() 
{ 
return View(); 
} 
+0

これは完全な解決策ではありません。新しい行はすべての@ {}ブロックに表示されます(最初の行だけでなく)、私はそれを処理する解決策を優先します。しかし、私はあなたの質問を受け入れるでしょう、代替がない場合。 –

+0

新しい行をすべて削除するように調整しましたが、明らかにこれがあなたの望むものではない可能性があります。ブラウザでhtmlソースを読むのが難しくなります。私は援助のされているのでうれしい。 – Phil

+0

新しい行をすべて削除することではありません。 @ {}ブロックで囲まれた行を削除することです。 –

2

私はあなただけ@{}の最後にタグを動かす提案知っているが、なぜその前にそれを置きません。また、この空白がエラーや問題を引き起こしていますか?あなたは、それがmvcやかみそりからではなくあなたのコードによって作成された空白のためであることをはっきりと見ることができます。おそらく、

このような何か:

@using InvoiceDocflow.Controllers 
<?xml version="1.1" encoding="UTF-8" ?> 
@{ 
Response.ContentType = "text/xml"; 
} 
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"; 
} 
2

なし - それはちょうど空のだから、それは非常に簡単なはず私はそれについてのブログ記事を書いた。

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

+0

"解決策2"がうまく機能しました(キャッシュマニフェストファイルを生成しています)。共有ありがとう! –

+0

コメントでevanswdの提案がうまくいってくれてとても簡単でした! –

+1

解答のインラインサマリーか、このリンクをコメントに変換してください。 –

1

あなたが移動した場合:

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

をレイアウトテンプレートの最上部に、あなたのXMLページは、それが動作するはずその出力XMLデータを継承しています。

6

キャッシュマニフェストファイルを返そうとしているときに、ページの上部にある空白行で同様の問題が発生しました。解決策、Response.Write( "...")を追加すると、これはページの最初の行に表示されます。

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

} ....... 
+0

この感謝していない答えが私のために働いた。 XMLファイルは先頭行にdoctypeがなくてはなりません。 @ {}セクションは、ページ上の他のものの前に実行されます。 Razorがページの内容より先行して余分な空白を追加する前に、Response.Write()も実行されます。他の回答で示唆されているように、Doctypeをビューの一番上に移動しても問題は解決しませんでした。 – Roberto

4

これは古い質問ですが、私はこの問題の解決策を探していました。 誰も簡単な解決策を持っていないので、ここに私です:

私はこれを通常のビューの代わりに部分的なビューを使って修正することができました。 私はレイアウトに問題があると考えています。たとえそれをnullに設定したとしても、まだ空白の1行目が追加されているようです。 @ {}には空白行も含まれているため、ビューの一番下に移動する必要があります。

はそうちょうど部分図を追加して、あなたのコントローラのような部分的なビューを返すがあります:あなたはこのようにそれを設定する必要がありますで、あなたの@ {}と(あなたの部分図に続いて

public ActionResult GenerateXML() 
{ 
    return PartialView("_XML"); 
} 

を下):私はこのことを願っています

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

@model string 
<?xml version="1.0" encoding="UTF-8" ?> 
<response> 
    <message>@Model</message> 
</response> 
@{ Response.ContentType = "text/xml";} 

これはのHTMLソースになりますこの問題に遭遇する他の人を助ける。

+0

これは私のために働いた唯一の解決策です –

+0

簡単に実装し、すぐに働きました。 –

2

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

_ViewStart.cshtml

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

別.cshtml

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

は最後に、それは意味が1に共通DOCTYPEを定義します場所。

関連する問題