4

I try to send parameter to asmx(web service file) but i get error about "System.InvalidOperationException: Missing parameter". Please help me to solve this problem and thank you so much

this is my ajax function

$("#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
            });
        });

this is my code from 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);
    }

and in web config file

  <webServices>
    <protocols>
      <add name="HttpGet"/>
      <add name="HttpPost"/>
    </protocols>
  </webServices>
2
  • 1
    This is vulnerable to sql injection and you should look into changing the query to SqlCommand + Parameters at the least Commented Mar 31, 2015 at 16:20
  • But the error Missing parameter it means parameter from ajax not send to asmx. right or not ? Commented Mar 31, 2015 at 16:41

2 Answers 2

1

Problem in your code is in the way you are passing the input parameter to the method, change it like this:-

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

Then, pass it like this in the method:-

data : JSON.stringify(rowID)

Apart from this your ADO.NET code is open for SQL Injection attack, so please use parametrized query instead.

Sign up to request clarification or add additional context in comments.

Comments

1

I have updated your code, below code works for me. Please remember I have hardcoded var rowID = 20; make your changes as you need.

Please let me know if you have any questions.

ASPX Page button:

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

Javascript "sendrequest" Function:

<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 Method:

[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();
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.