提问人:Steven Pfeifer 提问时间:1/19/2017 更新时间:1/19/2017 访问量:3834
在 C# 代码隐藏中调用 WebMethod,而无需在 ASPX 页中使用服务器窗体
Call WebMethod in C# codebehind without using a server form in ASPX page
问:
由于样式问题,并且需要在一个网页上添加多个表单,我目前有一个表单超出了 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 中设置的任何断点都不会在页眉中触发。提前感谢您的帮助!
答:
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=button
type=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
}
评论
Class/Method