2009-12-16 51 views
91

que tienen el siguiente código de jQuery para llamar a un WebMethod en una página aspxpasar varios parámetros a jQuery Ajax llamada

$.ajax({ 
    type: "POST", 
    url: "popup.aspx/GetJewellerAssets", 
    contentType: "application/json; charset=utf-8", 
    data: '{"jewellerId":' + filter + '}', 
    dataType: "json", 
    success: AjaxSucceeded, 
    error: AjaxFailed 
}); 

y aquí está la firma del método Web

[WebMethod] 
public static string GetJewellerAssets(int jewellerId) 
{ 

Esto funciona bien.

Pero ahora tengo que conseguir dos parámetros pasados ​​al método Web

el nuevo método web se ve como esto

[WebMethod] 
public static string GetJewellerAssets(int jewellerId, string locale) 
{ 
} 

¿Cómo puedo cambiar el código de cliente para llamar con éxito esta nueva firma del método?

EDIT:

Los siguientes 2 sintaxis trabajaron

data: '{ "jewellerId":' + filter + ', "locale":"en" }', 

y

data: JSON.stringify({ jewellerId: filter, locale: locale }), 

donde el filtro y la configuración regional son variables locales

+9

'data: JSON.stringify ({jewellerId: filter, locale: locale})' es la mejor manera que he encontrado, gracias @ChrisCa –

+0

Si eres un alma triste como yo, es posible que te hayas atascado esto por horas. Al usar 'JSON.stringify' con un literal de objeto, DEBE incluir el nombre del parámetro con dos puntos, todo dentro de llaves '{}'. El uso de 'JSON.stringify (objectLiteral)' no funciona. –

+0

Firma de método como '[WebMethod] [ScriptMethod (UseHttpGet = true)] cadena pública estática TestIBAN (cadena ccc)'? – Kiquenet

Respuesta

129

No utilizar la concatenación de cadenas para pasar parámetros, sólo tiene que utilizar un hash de datos:

$.ajax({ 
    type: 'POST', 
    url: 'popup.aspx/GetJewellerAssets', 
    contentType: 'application/json; charset=utf-8', 
    data: { jewellerId: filter, locale: 'en-US' }, 
    dataType: 'json', 
    success: AjaxSucceeded, 
    error: AjaxFailed 
}); 

ACTUALIZACIÓN:

Como sugiere @Alex en la sección de comentarios, una ASP.NET PageMethod espera que los parámetros se codifiquen en JSON en la solicitud, por lo que JSON.stringify se debe aplicar en el hash de datos:

$.ajax({ 
    type: 'POST', 
    url: 'popup.aspx/GetJewellerAssets', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ jewellerId: filter, locale: 'en-US' }), 
    dataType: 'json', 
    success: AjaxSucceeded, 
    error: AjaxFailed 
}); 
+12

Considerar también usando 'JSON.stringify (myObject)' para crear una cadena JSON desde un objeto javascript, en caso de que desee agrupar sus parámetros en una clase más adelante. –

+1

gracias por las respuestas; sin embargo, obtengo un estado HTTP 500 cuando pruébalo así. ¿Alguna idea? o incluso cómo depurarla? El punto de corte en el método web nunca es golpeado – ChrisCa

+1

código nuevo como sigue $ .ajax ({ tipo: 'POST', url: 'popup.aspx/GetJewellerAssets', contentType: 'application/json; charset = utf-8' , datos: {jewellerId: filtro, locale: 'en-US'}, Tipo de datos: "json", éxito: AjaxSucceeded, error: AjaxFailed }); – ChrisCa

17
data: '{"jewellerId":"' + filter + '","locale":"' + locale + '"}', 
+1

esto funcionó: '{"jewellerId":' + filter + ', "locale": "en"}', (obviamente no codificaré duro la configuración regional en en, pero esta es la sintaxis que funcionó. – ChrisCa

+0

Esto funcionó para mí con MVC 3. No pude conseguir el camino de Darin para trabajar, quizás es una cosa de MVC 3. – fiat

6

sólo tiene que añadir tantas propiedades como necesita al objeto de datos.

$.ajax({ 
        type: "POST", 
        url: "popup.aspx/GetJewellerAssets", 
        contentType: "application/json; charset=utf-8", 
        data: {jewellerId: filter , foo: "bar", other: "otherValue"}, 
        dataType: "json", 
        success: AjaxSucceeded, 
        error: AjaxFailed 
       }); 
+1

¿Cómo sería la firma de los métodos web en este caso para leer las propiedades en 'datos' en el lado del servidor? – Flo

3

¿Alguien más ha notado que la cadena/objeto json no es válida en todas las respuestas excepto en la de David Hedlund? :)

Los objetos JSON se deben formatear de la siguiente manera: {"clave": ("valor" | 0 | falso)}. Además, escribirlo como una cadena requiere mucho menos que codificar el objeto ...

3
$.ajax({ 
    type: 'POST', 
    url: 'popup.aspx/GetJewellerAssets',  
    data: "jewellerId=" + filter+ "&locale=" + locale, 
    success: AjaxSucceeded, 
    error: AjaxFailed 
}); 
+0

Trabajando también usando *** tipo: OBTENER*** ? – Kiquenet

+0

o puede usar una matriz para pasar datos en jason.stringyfy (matriz). –

0

Todo es cuestión de datos que se pasan; tiene una cadena con el formato adecuado. Si está pasando datos vacíos, entonces los datos: {} funcionarán. Sin embargo, con múltiples parámetros, debe tener el formato correcto p.

var dataParam = '{' + '"data1Variable": "' + data1Value+ '", "data2Variable": "' + data2Value+ '"' + '}'; 

....

datos: dataParam

...

La mejor manera de entender es tener controlador de errores con el parámetro de mensaje adecuado, a fin de conocer los errores detallados.

0

me ha pasado con éxito múltiples parámetros usando JSON

data: "{'RecomendeeName':'" + document.getElementById('txtSearch').value + "'," + "'tempdata':'" +"myvalue" + "'}", 
-1

Sólo para añadir en [Esta línea perfectamente trabajar en Asp.net & hallazgo de control web en campos Jason Ej: <% Fieldname%>]

data: "{LocationName:'" + document.getElementById('<%=txtLocationName.ClientID%>').value + "',AreaID:'" + document.getElementById('<%=DropDownArea.ClientID%>').value + "'}", 
1
var valueOfTextBox=$("#result").val(); 
    var valueOfSelectedCheckbox=$("#radio:checked").val(); 

    $.ajax({ 
    url: 'result.php', 
    type: 'POST', 
    data: { forValue: valueOfTextBox, check : valueOfSelectedCheckbox } , 
    beforeSend: function() { 

      $("#loader").show(); 
     }, 
    success: function (response) { 
     $("#loader").hide(); 
     $("#answer").text(response); 
    }, 
    error: function() { 
     //$("#loader").show(); 
     alert("error occured"); 
    } 
    }); 
1

no utilice el método de abajo para enviar los datos a través de ajax llamada

data: '{"jewellerId":"' + filter + '","locale":"' + locale + '"}' 

Si por error el usuario ingresa un carácter especial como comilla simple o comillas dobles , la llamada ajax falla debido a una cadena incorrecta.

Uso debajo método para llamar al servicio web sin ningún problema

var parameter = { 
     jewellerId: filter, 
     locale : locale 
}; 


data: JSON.stringify(parameter) 

En parámetro anterior es el nombre del objeto y Javascript stringify que al pasar al atributo de datos de la llamada AJAX.

Cuestiones relacionadas