2

これが私のajax呼び出しです:

response = $.ajax({
            type: "POST",
            url: "/Row/getRowName",
            dataType: "json",
            data:({ currRow : rowName, offset : 5 }),
            error:function(request){alert(request.statusText)},
            success:function(result){alert(result)}
        }).responseText;

内部サーバー エラーがアラートとして表示されます。また、RowController のメソッド getRowName にブレークポイントを設定しています。

getRowName メソッドは次のとおりです。

    [AcceptVerbs(HttpVerbs.Post)]
    public string getRowName(string currRow, int offset)
    {
        string rowName;

        rowName = _rowRepository.getRowNameByOffset(currRow, offset);

        return rowName;
    }

内部サーバー エラーの原因は何ですか? どうすれば修正できますか?コントローラーの概念全体を適切に使用していますか、またはこのようなものに WebServices を使用する必要がありますか?

編集:ページを呼び出すコントローラーは HomeController であり、私が行っている呼び出しは RowController に対するものです。RowController は HomeController と同じフォルダーにあります (それが問題かどうかはわかりません)。

しかし、モック関数を作成するかどうかがわかりました:

    [AcceptVerbs(HttpVerbs.Post)]
    public string sayHi()
    {
        return "Hi";
    }

同じ方法で呼び出します(ホームコントローラーにあるため、異なるURLです):

response = $.ajax({
            type: "POST",
            url: "/Home/sayHi",
            dataType: "json",
            error:function(request){alert(request.statusText)},
            success:function(result){alert(result)}
        }).responseText;

なぜこれが機能し、他の機能が機能しないのかについてのアイデアはありますか?

4

5 に答える 5

3

FireBugがインストールされた IE8 または Firefox を実行していますか? いずれかでスクリプト コンソールを使用すると、サーバーから取得しているエラーの詳細に関するより多くの情報が得られます。

あなたが投稿した2つの方法の違いはパラメータです - あなたの編集の2番目の方法には何もありませんが、最初の方法にはいくつかあります - あなたが見ているエラーはフレームワークがデータを正しくデシリアライズしないことに対処します。

最初の例では、次のことを試しましたか:

data:"{ \"currRow\":\"" + rowName + "\", \"offset\":\"5\" }" 
于 2009-06-24T08:01:17.380 に答える
0

これを明示的に追加しなかったため、500 エラーが発生しました。

type: "POST",

それを追加したら、すべてがうまくいきました。Action メソッドを GET または POST として明示的にマークしなかったため、デフォルトでは POST であると想定しているため、エラーが発生します。

于 2011-04-03T23:43:12.047 に答える
0

サーバーは回復力がある必要があります。JQuery やクライアントが行うことによって HTTP 500 エラーが発生することはありません。サーバーに関しては、あなたが与えたコードは何も説明していません。要約すると、次のようになります。

return _rowRepository.getRowNameByOffset(currRow, offset)

したがって、それを理解するには、少なくとも getRowNameByOffset のソースが必要になるでしょう。

編集:テストのために試すことができるもう1つの考えは、getRowNameに次のような些細なことを返すことです:

return "currRow" + " " + offset

問題が他にないことを確認します。

于 2009-06-24T02:03:40.483 に答える
0

あなたの問題は、データを囲む括弧にあると思います。実際には、引数に使用されているオブジェクトである必要があります。私が正しければ、内部サーバー エラーは、ルート ハンドラーが の適切な署名を見つけられないことが原因ですgetRowName

それが機能するには、文字列ではなく、メソッドから JsonResult を返す必要もあります。ActionResult を返すメソッドのみを検索する可能性があるため、これも問題になる可能性があります。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult getRowName(string currRow, int offset)
{
    string rowName;

    rowName = _rowRepository.getRowNameByOffset(currRow, offset);

    return Json( new { RowName = rowName } );
}

また、Ajax 呼び出しはオブジェクトになりません。成功ハンドラーに、応答で何をしようとしているかを実行させる必要があります。

$.ajax({
        type: "POST",
        url: "/Row/getRowName",
        dataType: "json",
        data: { currRow : rowName, offset : 5 },
        error:function(request){alert(request.statusText)},
        success:function(result){
           $('#rowNameContainer').html( result.RowName );
        }
});

変数で結果を本当に必要とする場合 (可能性は低いですが可能です)、ajax 呼び出しを同期的に実行し ( async: false)、success 関数に変数を設定できます。

$(...).click( function() {
   var response = null;
   $.ajax({
        type: "POST",
        async: false,
        url: "/Row/getRowName",
        dataType: "json",
        data: { currRow : rowName, offset : 5 },
        error:function(request){alert(request.statusText)},
        success:function(result){
           response = result.RowName;
        }
   });

   ... do something with response...
   return false;
});
于 2009-06-24T02:12:23.337 に答える