2015-03-31 234 views
3

我嘗試將參數發送到asmx(web服務文件),但我得到關於「System.InvalidOperationException:Missing parameter」的錯誤。請幫我解決這個問題,太感謝你了System.InvalidOperationException:缺少參數

這是我的AJAX功能

$("#dd_address").change(function() { 

      var rowID = $(this).find(':selected').val(); 
      console.log(rowID); 
      $.ajax({ 
       url: "WebService.asmx/queryCity", 

       data: { 
        id: JSON.stringify(rowID),       
       }, 
       type: "POST", 
       dataType: "json", 
       contentType: "application/json; charset-utf-8", 
       success: OnSuccess, 
       error: OnError 
      }); 
     }); 

這是ASMX

DataTable result; 

    [WebMethod(EnableSession = true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string queryCity(string id) 
    { 

     DataTable dt; 
     SqlConnection MRK_Conn = new SqlConnection(@"Data Source=192.168.24.30;Initial Catalog=Marketing_Data;Persist Security info=True;User ID=sa;Password=sa"); 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataReader sql_dr; 
     System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 

     MRK_Conn.Open(); 
     cmd = new SqlCommand("select [City RowID], [City Description] from City where [Des Ref Province] = '" + id + "'", MRK_Conn); 
     dt = new DataTable(); 
     sql_dr = cmd.ExecuteReader(); 
     dt.Load(sql_dr); 
     sql_dr.Close(); 
     MRK_Conn.Close(); 
     result = dt; 

     return serializer.Serialize(result); 
    } 

,並在網絡配置文件我的代碼

<webServices> 
    <protocols> 
     <add name="HttpGet"/> 
     <add name="HttpPost"/> 
    </protocols> 
    </webServices> 
+1

這是似曾相識易於sql注入,你應該考慮改變查詢SqlCommand +參數在至少 – Neps 2015-03-31 16:20:48

+0

但錯誤Missing參數它意味着參數從ajax不發送到asmx。對不對? – user3001046 2015-03-31 16:41:55

回答

1

代碼中的問題是您將輸入參數傳遞給方法的方式,將其更改爲l IKE在此: -

var rowID = { "id" : $(this).find(':selected').val() }; 

然後,通過像這樣的方法: -

data : JSON.stringify(rowID) 

除此之外您的ADO.NET代碼是開放的SQL Injection攻擊,所以請使用參數化查詢來代替。

+0

感謝您的回覆,但它不起作用 – user3001046 2015-04-01 02:07:21

+0

不工作?還是一樣的錯誤? – 2015-04-01 02:11:23

+0

是的,Rahul Singh – user3001046 2015-04-01 02:29:39

1

我已更新您的代碼,下面的代碼適用於我。請記住我已經硬編碼var rowID = 20;根據需要進行更改。

請讓我知道如果您有任何問題。

ASPX頁面按鈕:

<input type="button" value="submit" onclick="sendrequest();" /> 

的Javascript 「sendRequest將」 功能:

<script> 
    function sendrequest() 
    { 
     var rowID = 20; 
     console.log(rowID); 
     $.ajax({ 
      url: "WebService.asmx/queryCity", 
      data: '{"id":"' + rowID + '"}', 
      type: "POST", 
      dataType: "json", 
      contentType: "application/json; charset-utf-8", 
      success: function (data) { 
       var xmlDoc = $.parseXML(data.d); 
       var xml = $(xmlDoc); 
       var city = xml.find("Table1"); 
       alert(city.text()); 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       alert('error: ' + xhr.status + ' ' + thrownError); 
      } 
     }); 

    } 
</script> 

Webservice的方法:

[WebMethod(EnableSession = true)] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string queryCity(string id) 
{ 
    DataSet ds = new DataSet(); 
    DataTable dt= new DataTable("Table"); 
    SqlConnection MRK_Conn = new SqlConnection(@"Data Source=KEVAL;Initial Catalog=SampleDatabase;Persist Security info=True;User ID=sa;Password=sa123"); 
    SqlCommand cmd = new SqlCommand(); 
    SqlDataReader sql_dr; 
    System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 

    MRK_Conn.Open(); 
    cmd = new SqlCommand("select [City RowID], [City Description] from City where [Des Ref Province] = '" + id + "'", MRK_Conn); 
    dt = new DataTable(); 
    sql_dr = cmd.ExecuteReader(); 
    dt.Load(sql_dr); 
    sql_dr.Close(); 
    MRK_Conn.Close(); 
    ds.Tables.Add(dt); 

    return ds.GetXml(); 
} 
+0

謝謝你的回覆,但它不起作用 – user3001046 2015-04-01 02:07:26

+0

我已經更新了我的答案。請檢查。 – Keval 2015-04-01 07:05:38