我们可以从JavaScript Post方法调用aspx.cs中的非静态函数吗

我们可以从JavaScript Post方法调用aspx.cs中的非静态函数吗,javascript,c#,asp.net,webforms,Javascript,C#,Asp.net,Webforms,我想详细了解这些电话是如何工作的。我知道我们可以在Web表单中声明一个服务类,它派生自System.Web.Services.WebService,使用此[WebMethod(EnableSession=true)]声明函数后,可以从JavaScript调用此服务类中的函数 我有一些aspx页面,它们的后端aspx.cs文件只包含公共类。有什么方法可以调用这些aspx.cs文件和那些公共类中的函数吗。静态和非静态功能两者均。如果不是,背后的原因是什么,如果是,那么它是如何工作的 本文旨在深入了解

我想详细了解这些电话是如何工作的。我知道我们可以在Web表单中声明一个服务类,它派生自System.Web.Services.WebService,使用此[WebMethod(EnableSession=true)]声明函数后,可以从JavaScript调用此服务类中的函数

我有一些aspx页面,它们的后端aspx.cs文件只包含公共类。有什么方法可以调用这些aspx.cs文件和那些公共类中的函数吗。静态和非静态功能两者均。如果不是,背后的原因是什么,如果是,那么它是如何工作的


本文旨在深入了解web表单的结构和工作方式。

这些方法必须是静态的。静态方法对于每个页面都完全相同。因为它是一个网页,所以多个用户可以访问它。如果你的站点上有4个用户打开了页面,并且有一个方法说“DoX”,那么它必须能够为每个人做完全相同的事情

例如,对页面方法的一个常见误解是:不能从静态WebMethod/page方法访问页面上的控件。如果该方法说“更新此控件”,那么应该更新哪个控件,在哪个页面上?用户1、2、3或4?不可能知道

您必须将代码隐藏方法中的数据/信息返回给调用该方法的javascript方法,然后从javascript方法更新页面控件


不可能使用javascript/jQuery从客户端调用非静态方法。要使用javascript调用非静态方法,可以使用一些不同的方法,如使用web服务、WCF服务等

我将解释如何使用javascript通过web服务调用非静态方法:

首先创建一个新的web应用程序在我的例子中,应用程序名称是“WebApplicationDemo”

我在这个名为“WebService1.asmx”的项目中添加了webservice

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebApplicationDemo
{
/// <summary>
/// Summary description for WebService1
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{

[WebMethod]
public string HelloWorld(string strName)
{
return "Hello " + strName + ", The current time is = " + DateTime.Now + "";
}
}
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplicationDemo.WebForm1" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

<script type="text/javascript">
function getTime() {
var name = document.getElementById("txtName").value;
WebApplicationDemo.WebService1.HelloWorld(name, getTimeSuccess, getTimeError);
}
function getTimeSuccess(result) {
alert(result);
}
function getTimeError(error) {
alert(error);
}

</script>

</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/WebService1.asmx" />
</Services>
</asp:ScriptManager>
<div style="font-family: Arial">
<asp:Label runat="server" Text="Enter Your Name"></asp:Label>
<asp:TextBox runat="server" ID="txtName" Height="20" Width="150"></asp:TextBox>
<input type="button" id="btnGetTime" value="Submit" onclick="getTime()" />
</div>
</form>
</body>
</html>
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.Services;
命名空间WebApplicationDemo
{
/// 
///WebService 1的摘要说明
/// 
[WebService(命名空间=”http://tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
//要允许使用ASP.NET AJAX从脚本调用此Web服务,请取消注释以下行。
[System.Web.Script.Services.ScriptService]
公共类WebService 1:System.Web.Services.WebService
{
[网络方法]
公共字符串HelloWorld(字符串strName)
{
返回“Hello”+strName+”,当前时间为=“+DateTime.Now+”;
}
}
}
构建项目,然后添加名为“WebForm1.aspx”的新webform

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebApplicationDemo
{
/// <summary>
/// Summary description for WebService1
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{

[WebMethod]
public string HelloWorld(string strName)
{
return "Hello " + strName + ", The current time is = " + DateTime.Now + "";
}
}
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplicationDemo.WebForm1" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

<script type="text/javascript">
function getTime() {
var name = document.getElementById("txtName").value;
WebApplicationDemo.WebService1.HelloWorld(name, getTimeSuccess, getTimeError);
}
function getTimeSuccess(result) {
alert(result);
}
function getTimeError(error) {
alert(error);
}

</script>

</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/WebService1.asmx" />
</Services>
</asp:ScriptManager>
<div style="font-family: Arial">
<asp:Label runat="server" Text="Enter Your Name"></asp:Label>
<asp:TextBox runat="server" ID="txtName" Height="20" Width="150"></asp:TextBox>
<input type="button" id="btnGetTime" value="Submit" onclick="getTime()" />
</div>
</form>
</body>
</html>

函数getTime(){
var name=document.getElementById(“txtName”).value;
WebApplicationDemo.WebService1.HelloWorld(名称、getTimeSuccess、getTimeError);
}
函数getTimeSuccess(结果){
警报(结果);
}
函数getTimeError(错误){
警报(错误);
}
现在在web浏览器中运行该项目,您将看到文本框和按钮,在我的情况下,文本框中有类型“Purvesh”,然后按submit。它确实调用了包含我的非静态方法的服务并返回结果

输出


你好,Purvesh,当前时间是15年9月18日下午4:04:10,我理解这部分内容。然而,当我们调用时,我们能够在代码隐藏处访问会话,如果它无法更新控件,而不知道它是用户1、2、3还是4,那么它如何知道这是哪个会话?如果它知道会话,那么为什么不更新控制?会话不是页面的一部分,而是应用程序的一部分。见Global.asax。您可以从页面访问if,但它不是该页面。我想我知道你在说什么,但我认为这与能够访问js背后的代码有关,js改变了一切;如果您访问代码隐藏而不发回页面,服务器将无法假定该页面的任何内容,因为它没有足够的信息。我正在寻找一个可能有帮助的链接,但该网站已不存在。我不确定我到底能不能充分、恰当地解释它。不过我明白你的问题。