Como faço para passar parâmetros opcionais para um webMethod via JSON?
Pergunta
Eu tenho a seguinte classe JSON que pretendo usar para executar chamadas de gerenciamento no meu banco de dados de maneira assíncrona:
<script type="text/javascript">
var CalendarManager = {
defaultOptions: {
staffcode: 0, // required
date: 0, // required
activityCode: 0, // required
clientCode: null, // optional
contactCode: null, // optional
destination: '', // optional/doesn't matter
travelCode: null, // optional
miles: null, // optional
overnight: false, // optional
notes: '' // optional/doesn't matter
},
createEvent: function(options) {
var combinedOptions = $.extend(true, {}, this.defaultOptions, options);
$.ajax({
type: "POST",
url: 'calendar/calendar-manager-ajax.aspx/CreateEvent',
data: combinedOptions,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data, textStatus, XMLHttpRequest) {
alert(textStatus + ", " + data);
},
error: function(data, textStatus, XMLHttpRequest) {
alert(textStatus + ", " + data);
}
});
}
};
</script>
Eu então uso na minha página como assim:
<script type="text/javascript">
CalendarManager.createEvent(); // random test
</script>
No momento, estou tentando obter esta chamada de chamadas Ajax o método a seguir:
[WebMethod()]
public static string CreateEvent(int staffcode, int date,
int activitycode, int? clientcode,
int? contactCode, string destination,
int? travelcode, int? miles,
bool overnight, string notes)
{
return null;
}
Infelizmente, o método CreateEvent
Não está sendo chamado e recebo um erro de Ajax (definir um ponto de interrupção não para de execução):
Erro, [Objeto XmlHttPrequest
Se eu mudar data: combinedOptions
para data: "{}"
e adicione outro método ao meu ASPX (como abaixo), o código funciona com sucesso:
[WebMethod()]
public static string CreateEvent()
{
return null;
}
Basicamente, minha pergunta é: como especificar parâmetros opcionais para um WebMethod
Ao fornecer dados JSON?
Eu sei que posso reduzir os parâmetros apenas para os valores necessários e depois usar HttpContext.Request.Params
Para ler os valores dos parâmetros opcionais, mas eu teria pensado da maneira que tentei aqui deveria ter funcionado.
EDITAR
o XMLHttpRequest.responseText
O valor do erro é:
JSON inválido Primitivo: Staffcode.
Isso está me jogando ainda mais fora do perfume do problema :(
Solução 2
Corrigido. Havia 2 problemas.
Em primeiro lugar, o caso de todos os meus parâmetros estava incorreto (note "ActivityCode" não "ActivityCode").
E agora também uso isso:
data: JSON.stringify(combinedOptions)
Erros bobos realmente, mas aí está.
Outras dicas
Não existem coisas como parâmetros 'opcionais'. Passe um padrão para parâmetros não utilizados.