2012-10-29 14 views
17

は、私がHTTPレスポンスに包まれた文字列を返すと言います。だから、XHRで、私はこのような何かを得る:つまりASP.NET WebAPI:クライアントに返される文字列コンテンツを制御する方法は?</p> <pre><code>return Request.CreateResponse(HttpStatusCode.BadRequest, "Line1 rn Line2"); </code></pre> <p>jQueryのから、このアクションを起動、応答テキストは、それが返される前に処理されます。WebAPIの中

function success(xhr) { 
    alert(xhr.responseText); // alerts ""Line1 \\r\\n Line2"" 
} 

を、文字列は二重引用符に包まれます、そして、彼らは出力に表示されるように特殊文字をエスケープします(実際の警告は、「ライン1 \ rとします\ n Line2 "であるので、改行は保存されず、エンコードされ、応答テキストに表示されます)。

私は引用符を削除し、そのようにクライアントに改行を置き換えることによって、これを回避することができます

var responseText = xhr.responseText.substr(1, xhr.responseText - 2) 
    .replace('\\r', '\r').replace('\\n', '\n'); 

をしかし、文字列の応答をフォーマットする方法WebAPIのを指示する方法はありますか?たとえば、二重引用符で囲み、エスケープ文字を変換しないようにしますか?

答えて

18

これは、コントローラが文字列値が引用されたJSONを返すために発生します。

簡単な解決策は、JSONとしてresponseTextを解析すると、意図したとおりに、あなたが値を使用することができます:

$.ajax("/api/values/10", { 
    error: function (xhr) { 
     var error = JSON.parse(xhr.responseText); 
     $("textarea").val(error); 
    } 
}); 

これは正しく改行/キャリッジリターンを解釈します。

また、あなたのコントローラでtext/plainメディアタイプを指定することができます。

return Request.CreateResponse(
    HttpStatusCode.BadRequest, 
    "Line1 \r\n Line2", "text/plain"); 

のWeb APIは、残念ながらOOTB存在しないtext/plainのための適切なメディアタイプフォーマッタを試してみて、ロードします。 WebApiContribに1件見つかります。

+0

ありがとう、これは私が探していたものです。もう一つの最終的な質問は、より良いです:設定にメディアタイプフォーマッタを追加し、CreateResponseの第3引数として "text/plain"を使用するか、新しいPlaintTextFormatter()を第3引数として使用するか? – danludwig

+1

Web APIは構成から適切なフォーマッタを探し出すので、私は最初のオプションを優先します。フォーマッタを変更したことがある場合は、一箇所で行うだけです。 –

+0

なぜjQueryのajaxはレスポンスをエラーと解釈しますか? –

3

あなたの後はカスタムですMediaTypeFormatter既存のカスタムカスタムを実装して既存のものを実装したいと思っているか、期待しているAcceptヘッダが何であるかによって、新しいカスタムカスタムを作成しているようです。良いニュースは、既存のものを交換したり、新しいMediaTypeを好きなように思いついたりできることです。あなたが始めるのに役立つカップルの場所はここで見つけることができます:

http://byterot.blogspot.com/2012/04/aspnet-web-api-series-part-5.html

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

私はデフォルトのフォーマッタの一部をスワップアウトされてきたようにはい、私は実際にはごく一部でこれをやりました例えばより速いもの、すなわちServiceStackを備えたJSONです。

関連する問題