2017-09-07 6 views
0

ヒットしていないコードの中にWebMethodがあります。私はたくさんのGoogle検索をして、このような質問をたくさん見つけました。私はすべての提案を試みました。aspx codebehindのWebメソッドがヒットしない

IDE:Visual Studioの2017 フレームワーク:4.0 jQueryのバージョン:3.1.1 プロジェクトタイプ:Webフォーム(ええ、私は私の最愛のMVCを逃すが、それは私のせいではない!)

エラー:

呼び出され

{"Message":"Invalid web service call, missing value for parameter: \u0027id\u0027.","StackTrace":" at System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary 2 parameters)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary 2 parameters)\r\n at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

URL:?{: "chkEditable"、 "wasChecked": "上"、 "ID"}私は2つのチェックボックスのいずれかをクリックすると

、私はクロームに次のエラーを取得するhttp://localhost:65050/Default.aspx/Save GETコンソル

GET http://localhost:65050/Default.aspx/Save ?{%22id%22:%22chkEditable%22,%22wasChecked%22:%22on%22} 500 (Internal Server Error) jquery-3.1.1.min.js:4

は、ここに私のaspxコードです:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
Inherits="TesteWebMethod.Default" %> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<title></title> 

<script src="Scripts/jquery-3.1.1.js"></script> 
<script src="Scripts/jquery-3.1.1.min.js"></script> 

<script> 
    $(document).ready(function() { 
     $('#chkVisible').change(function() { 
      Save('chkVisible', $('#chkVisible').val()); 
     }); 

     $('#chkEditable').change(function() { 
      Save('chkEditable', $('#chkEditable').val()); 
     }); 
    }); 

    function Save(_id, _state) { 
     var pageUrl = '<%= ResolveUrl("~/Default.aspx")%>'; 
     var _data = { "id": _id, "wasChecked": _state }; 

     $.ajax({ 
      type: "GET", 
      url: pageUrl + "/Save", 
      data: JSON.stringify(_data), 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: OnSuccess, 
      failure: OnFailure 
     }); 
    } 

    function OnFailure(response) { 
     console.log('falha'); 
     alert(response.d); 
    } 
    function OnSuccess(response) { 
     console.log('sucesso'); 
     alert(response.d); 
    } 
</script> 
</head> 
<body> 
<form id="form1" runat="server"> 
    <asp:CheckBox runat="server" AutoPostBack="false" ID="chkVisible" Text="Visivel" /> 
    <asp:CheckBox runat="server" AutoPostBack="false" ID="chkEditable" Text="Editavel" /> 
</form> 

そしてここでは、コードビハインド

using System; 
using System.Web.Script.Serialization; 
using System.Web.Script.Services; 
using System.Web.Services; 

namespace TesteWebMethod 
{ 
public partial class Default : System.Web.UI.Page 
{ 

    [WebMethod(true)] 
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
    public static string Save(string id, string wasChecked) 
    { 
     bool b = wasChecked == "on"; 

     string data = "Id " + (b ? "was checked" : "was unchecked"); 

     JavaScriptSerializer TheSerializer = new JavaScriptSerializer(); 

     var json = TheSerializer.Serialize(data); 

     return json; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
} 
} 

私は本当にこの上で捕まってしまったです。誰かが私が間違っていることを教えてもらえますか?

答えて

1

あなたが呼び出しているメソッドはGETメソッドですが、メソッドがPOSTメソッドであるかのようにデータを渡しています。 Webformsは、リクエストの内容からパラメータを取りだし、クエリ文字列のように動作します。リクエストに含めるJSONデータをURLにエンコードしてクエリ文字列にする必要があるか、メソッドをAJAX呼び出しと同様にPOSTメソッドに変換する必要があります。

+1

JSONデータは、クエリ文字列にそれを作っている場合でも、私はこの方法が正しくパラメータにそれを解析することを信じていないでしょう。 –

+0

ありがとう@Kevin Hist。ある時点で私は失われてしまったということを、私がコードに多くの変更を加えてやっていると思います。私はちょうどGETからPOSTに変更して、うまくいきました。どうもありがとう。 –

1

オブジェクトをdataプロパティに設定すると、jsonオブジェクトをストリング化しないでください。jqueryはGETリクエストを作成する方法を知っています。

$.ajax({ 
    type: "GET", 
    url: pageUrl + "/Save", 
    data: {"id": _data.id, "wasChecked": "'" + _data.wasChecked + "'"}, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: OnSuccess, 
    failure: OnFailure 
}); 

私はそれはひどい実装だと思うThat's the way ASP knows that's a string、ためwasChecked属性に単一引用符を追加し、データをキュレートする必要がありました注意してください。

ケビン氏によると、POSTがはるかに良いでしょう。それは

$.ajax({ 
    type: "POST", 
    url: "WebMethodTest.aspx/Save", 
    data: JSON.stringify({ "id": 2, "wasChecked": "test" }), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" 
}); 

そして

[WebMethod(true)] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public static string Save(string id, string wasChecked) 
{ 
+1

謝辞+叫んでください。 –

+0

Kevinが示唆したように、私はPOSTに変更し、注釈に_UseHttpGet = true_パラメータを削除しました。ありがとう@ kblok、 –

関連する問題