在 C# 代码隐藏中调用 WebMethod,而无需在 ASPX 页中使用服务器窗体

Call WebMethod in C# codebehind without using a server form in ASPX page

提问人:Steven Pfeifer 提问时间:1/19/2017 更新时间:1/19/2017 访问量:3834

问:

由于样式问题,并且需要在一个网页上添加多个表单,我目前有一个表单超出了 runat=server 的正常表单。

我是否仍然可以使用 ajax 在此网页的 C# 代码隐藏中调用 WebMethod?我想将此窗体中的信息以不同的窗体提交到我之前在页面中使用的同一连接字符串。

这是我当前的代码:

$().ready(function () {
    $("input[type=submit]").click(function () {
        handleClick();
        createJob();
    });
});

function createJob() {
var txtTestValue = document.getElementById('jobTitle').value;

$.ajax({
    // POST signals a data request
    type: "POST",
    // This directs which function in the c# code behind to use
    url: "Account/help.aspx/CreateJob",
    // The paramater pageIndex, page number we need to load, to pass to GetCustomers(int pageIndex)
    data: txtTestValue,
    // Type of data we are sending to the server (i.e. the pageIndex paramater)
    contentType: "application/json; charset=utf-8",
    // Type of data we expect back from the server (to fill into the html ultimately)
    dataType: "text",
    // If all goes smoothly to here, run the function that fills our html table
    success: OnSuccess,
    // On failure, error alert user (aka me so that I know something isn't working)
    failure: function (response) {
        alert("failure");
    },
    error: function (response) {
        alert("error");
    }
});
});

还有我在代码隐藏中的 WebMethod:

[WebMethod]
public string CreateJob()
{
    //rest of my database code here
}

很抱歉造成混淆,但它在ajax代码之前一直在做所有事情,然后似乎忽略了它(并返回ajax失败并出现错误)。我的代码未到达 WebMethod,并且在 Visual Studio 中设置的任何断点都不会在页眉中触发。提前感谢您的帮助!

JavaScript C# jQuery asp.net AJAX

评论

0赞 maniak1982 1/19/2017
CreateJob 方法属于哪个类?ASP.NET 中 Web 方法的 URL 路径的约定是 。Class/Method
1赞 user2864740 1/19/2017
是的。使用开发人员工具在“正常”上下文中检查 WebMethod 请求。对 AJAX 执行相同的操作。如果出现错误,则表示请求未正确模拟。
0赞 Ross Bush 1/19/2017
我敢打赌,您收到的是 404 响应,并且“帐户/帮助.aspx/CreateJob”没有解析到您认为它正在解决的位置。
0赞 Steven Pfeifer 1/19/2017
@maniak1982它是一个公共分部类 gethelp,它继承自 Page 类,然后 aspx 端链接到我的 Page help.aspx.cs,但也继承自 gethelp 类......难道我有一个名为 help 的页面,它们继承自搞砸了它的 gethelp 类吗?(即将所有内容的名称更改为相同)
0赞 Steven Pfeifer 1/19/2017
@user2864740 谢谢!在哪里可以找到开发人员工具?或者有关于如何执行此操作的快速教程?我以前从未使用过这些

答:

2赞 Win 1/19/2017 #1

您需要将该方法声明为静态方法。

[WebMethod]
public static string CreateJob()
       ^^^^^
{
    //rest of my database code here
}

另一个问题是,如果 ASP.Net Button 控件,它将回发到服务器。不能使用 ASP.Net Server 控件使 jQuery Ajax 调用 - $.ajax。input[type=submit]

// This code won't work if `input[type=submit]` is a server button control
$(function () {
    $("input[type=submit]").click(function () {
        handleClick();
        createJob();
    });
});

您需要使用常规的 HTML 输入按钮控件,而不是 .type=buttontype=submit

评论

0赞 Steven Pfeifer 1/19/2017
把戏谢谢你!还有一个快速的问题,我之前的代码隐藏不是静态的,因为用户的名称在登录时会被记录和提交。有没有办法解决这个问题,仍然允许记录用户名,同时保持 WebMethod 静态?再次感谢
1赞 Win 1/19/2017
我不确定我是否理解您的评论,但是,如果您需要会话,您将需要.如果没有,你能创建一个新问题吗?[WebMethod(EnableSession = true)]
1赞 user2864740 1/19/2017
@StevenPfeifer 会话暂时性数据应通过会话状态共享。每个响应后没有正在运行的 Page 实例:它是为每个请求创建和销毁的。在某些情况下,使用静态变量可能看起来“有效”,但这种方法不可靠(例如,不能跨应用域工作),并且容易在交错请求之间保持无效状态。
1赞 user2864740 1/19/2017
@StevenPfeifer“重新验证用户身份?会话可用于存储用户是否经过身份验证 - 通常会存储类似“用户 ID”的东西,其中只有经过身份验证/登录/有效用户才能设置此类内容。这可以在 WebMethod 中与传输的所有其他会话信息一起检查。WebMethod 本身不对身份验证执行任何操作。会话状态通常被认为是“安全的”;假设会话 nonce-cookie 没有被拦截/窃取(参见 CSRF 等,了解相关的其他预防措施)。
1赞 user2864740 1/19/2017
@StevenPfeifer 会话状态使用的基本预防措施是仅限 http 的 cookie(.NET的内置会话状态提供程序)和HTTPS,等等。
1赞 Kurisinkal 1/19/2017 #2

web方法应该是静态的。

[WebMethod]
public static string CreateJob()
{
    //rest of my database code here
}