AJAX没有发布到WebMethod

时间:2013-05-15 13:47:54

标签: c# ajax file-upload webmethod

表格:

<form action="upload-document.aspx" onsubmit="sendAndClose();" method="post" enctype="multipart/form-data">
    <input name="fileToUpload" id="fileToUpload" type="file" />
    <input type="submit" name="submit" value="Send" />
</form>

AJAX:

    function sendAndClose() {
        currentUrl = location.protocol + '//' + location.host + location.pathname;

        var data = new FormData();
        var file = $("#fileToUpload")[0].files[0];

        data.append("name", file.name);
        data.append("size", file.size);
        data.append("type", file.type);
        data.append("file", file);

        $.ajax({
            type: "POST",
            url: currentUrl + '/Persist',
            dataType: 'json',
            data: data,
            cache: false,
            contentType: false,
            processData: false,
            success: function () {
                parent.$.fancybox.close();
            },
            error: function (request, error) {
                alert("[" + error + "] - FAIL: " + request.responseText);
                parent.$.fancybox.close();
            }
        });
    }

守则背后:

[WebMethod]
public static bool Persist(object data)
{
    return true;
}

提交表单时,它会运行ajax并在进入webmethod之前直接进入错误回调。谁能告诉我为什么?

另外,在'var file'之后我有一个警告来显示文件的名称,大小等...所以它获取文件,问题是ajax拒绝与代码隐藏通信。

3 个答案:

答案 0 :(得分:0)

我有一个类似的问题,通过在ajax函数中添加此参数来解决:

traditional: true

请尝试使用此代码进行AJAX调用:

$.ajax({
        type: "POST",
        url: currentUrl + '/Persist',
        dataType: 'json',
        data: data,
        cache: false,
        contentType: false,
        processData: false,
        traditional: true,
        success: function () {
            parent.$.fancybox.close();
        },
        error: function (request, error) {
            alert("[" + error + "] - FAIL: " + request.responseText);
            parent.$.fancybox.close();
        }
    });

答案 1 :(得分:0)

您无法调用http://localhost:40899/upload-document.aspx/Persist之类的网络方法。 currentUrl不正确。

答案 2 :(得分:0)

继续我在评论部分提出的问题后,我想补充一点,public static bool Persist...方法必须在页面中(ASPX),而不是用户控件(ASCX)。

这是因为页面(ASPX)通过URL对外界“可见”,而用户控件(ASCX)仅在服务器上用于构建页面而不是URI本身,并且因此外部呼叫者无法访问。

如果您需要在用户控件中调用该方法,则需要将Persist方法(带有WebMethod属性)移动到您的页面(ASPX),然后通过该方法调用进入你的用户控制(ASCX)。