12

これはMVC3アプリです。アクションに対して次のjavascript呼び出しがあります。

 function editDescription(docId,fileName, fileDescription) {
    $.ajax({
         type: "POST",
         url: "/OrderDetail/LoadModelData",
         contentType: "application/json; charset=utf-8",
         data: "{'id': '"+docId +"', 'filename': '"+fileName+"', 'description': '"+fileDescription+"'}",
         dataType: "json",
         success: function (result) {
         alert("ok: "+ result.d);
         },
         error: function (result) {
             alert('Oh no: '+ result.responseText);
         }
     });

これが私の行動です:

    [HttpPost]
    public string LoadModelData(string id, string filename, string description)
    {
        return filename;
    }

コードを実行すると、アクションはパラメーターを使用して呼び出され、nullは何もありませんが、エラー関数は毎回呼び出されます。したがって、「Oh no」が含まれるアラートボックスは毎回表示されますが、アクションから返される文字列は正しいです。ファイル名がtest.pdfの場合、エラーアラートボックスに次のように表示されます

    'Oh No: test.pdf'. 

Firebugを調べましたが、エラーはありません。エラーがないにもかかわらず、成功関数が呼び出されないのはなぜですか?

4

2 に答える 2

16

stringアクションメソッドからの値を期待(返し)しています。なぜデータ型をそのように指定する必要があるのjsonですか?それを削除して、何が起こるかを確認してください。そして、応答からのdプロパティはありません!したがって、アラートで結果を使用するだけです。

$.ajax({
         type: "POST",
         url: "/OrderDetail/LoadModelData",
         contentType:"application/json; charset=utf-8",         
         data: JSON.stringify({ 
                             id: docId, 
                             filename: fileName, 
                             description: fileDescription 
                            }),
         success: function (result) {
         alert("ok: "+ result);
         },
         error: function (result) {
             alert('Oh no: '+ result.responseText);
         }
     });

プロパティは、datatype クライアントが結果としてどのような種類のコンテンツを期待しているのかをサーバーに通知します。

編集:ダリンが述べたようにJSON.stringify、JSONリクエストをビルドするためのメソッドを使用してください。この回答を更新して、将来の訪問者のための正しい方法を含めます。

于 2012-06-13T16:34:43.963 に答える
9

文字列操作を使用してJSONを構築しないでください。

data: "{'id': '"+docId +"', 'filename': '"+fileName+"', 'description': '"+fileDescription+"'}",

それは絶対に恐ろしくて間違っています。何もエンコードしていません。で引用符を付けるだけで、descriptionすべてが壊れます。JSONを操作するときは、常にJSONパーサーを使用してください

このような:

$.ajax({
     type: "POST",
     url: "/OrderDetail/LoadModelData",
     contentType: "application/json; charset=utf-8",
     data: JSON.stringify({ 
         id: docId, 
         filename: fileName, 
         description: fileDescription 
     }),
     success: function (result) {
         alert("ok: "+ result.filename);
     },
     error: function (result) {
         alert('Oh no: '+ result.responseText);
     }
 });

このJSON.stringifyメソッドは、ネイティブに組み込まれている最新のブラウザーです。従来のブラウザをサポートする必要がある場合は、json2.jsスクリプトを含めることができます

もう1つの間違いは、コントローラーのアクションシグネチャです。ASP.NET MVCコントローラーでは、アクションは文字列ではなくActionResultsを返す必要があります。

[HttpPost]
public ActionResult LoadModelData(string id, string filename, string description)
{
    return Json(new { filename = filename });
}
于 2012-06-13T16:41:44.863 に答える