Comment puis-je passer des paramètres facultatifs dans un WebMethod via JSON?
Question
J'ai la classe JSON suivante, j'ai l'intention d'utiliser pour effectuer la gestion appelle ma base de données de manière asynchrone:
<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>
Je l'utilise alors dans ma page comme ceci:
<script type="text/javascript">
CalendarManager.createEvent(); // random test
</script>
À l'heure actuelle, je suis en train d'obtenir ce feu d'appel AJAX la méthode suivante:
[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;
}
Malheureusement, la méthode CreateEvent
n'est pas appelé, et je reçois une erreur AJAX (réglage d'un point d'arrêt ne stoppe pas l'exécution):
erreur, [objet XMLHttpRequest]
Si je change data: combinedOptions
à data: "{}"
et ajouter une autre méthode pour mon ASPX (comme ci-dessous) le code fonctionne avec succès:
[WebMethod()]
public static string CreateEvent()
{
return null;
}
En fait, ma question est: comment dois-je spécifier des paramètres facultatifs à un WebMethod
lors de la fourniture des données JSON
Je sais que je peux réduire les paramètres jusqu'à seulement les valeurs requises, et ensuite utiliser HttpContext.Request.Params
pour lire les valeurs de paramaters en option, mais je l'aurais pensé comme je l'ai essayé ici devrait avoir travaillé.
EDIT
La valeur de XMLHttpRequest.responseText
de l'erreur est la suivante:
Invalid JSON primitive. Staffcode
Cela me jette encore plus le parfum du problème: (
La solution 2
Correction d'elle. Il y avait 2 problèmes.
Tout d'abord, le cas de tous mes paramètres était incorrect (note "activityCode" non "activitycode").
Je l'utilise aussi maintenant ceci:
data: JSON.stringify(combinedOptions)
erreurs idiotes vraiment, mais là vous l'avez.
Autres conseils
Il n'y a pas de choses telles que les paramètres « facultatifs ». Passez par défaut pour params inutilisés.