如何通过JSON将可选参数传递到WebMethod?

时间:2010-02-15 16:23:55

标签: asp.net jquery webmethod

我有以下JSON类,我打算用它来异步地对我的数据库执行管理调用:

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

然后我在我的页面中使用它:

<script type="text/javascript">
    CalendarManager.createEvent(); // random test
</script>

目前,我正在尝试通过以下方法启动此AJAX调用:

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

不幸的是,方法CreateEvent没有被调用,我得到一个AJAX错误(设置一个断点不会停止执行):

  

错误,[object XMLHttpRequest]

如果我将data: combinedOptions更改为data: "{}"并向我的ASPX添加其他方法(如下所示),则代码可以成功运行:

[WebMethod()]
public static string CreateEvent()
{
    return null;
}

基本上,我的问题是:在提供JSON数据时,如何为WebMethod指定可选参数?

我知道我可以将参数减少到所需的值,然后使用HttpContext.Request.Params来读取可选参数的值,但我想我在这里尝试过的方法应该有效。

修改

错误的XMLHttpRequest.responseText值为:

  

无效的JSON原语:staffcode。

这让我更加摆脱了问题的气味:(

2 个答案:

答案 0 :(得分:2)

没有“可选”参数这样的东西。传递未使用的参数的默认值。

答案 1 :(得分:1)

修正了它。有2个问题。

首先,我所有参数的情况都不正确(注意“activityCode”而不是“activitycode”)。

我现在也用这个:

data: JSON.stringify(combinedOptions)

真的很傻,但你有它。