Javascript 当我需要运行服务器端代码时,如何响应按钮的点击(不提交页面)?

Javascript 当我需要运行服务器端代码时,如何响应按钮的点击(不提交页面)?,javascript,c#,jquery,asp.net,sharepoint-2010,Javascript,C#,Jquery,Asp.net,Sharepoint 2010,这是我的ASP.NET(Sharepoint)Web部件/页面的第22条军规。我需要响应一个按钮点击,但这样做需要代码是客户端(jQuery),因为服务器端/代码隐藏似乎只适用于“提交”过程,我不想在这种情况下提交页面 更清楚地说,我可以使用一个按钮(更准确地说,是HtmlButton)并在不提交表单的情况下响应单击它: 服务器端(C#): 客户端(jQuery): 这个很好用 我可以在服务器端(用C#)为“提交”按钮完成所有操作,如下所示: Button btnSave = new Butto

这是我的ASP.NET(Sharepoint)Web部件/页面的第22条军规。我需要响应一个按钮点击,但这样做需要代码是客户端(jQuery),因为服务器端/代码隐藏似乎只适用于“提交”过程,我不想在这种情况下提交页面

更清楚地说,我可以使用一个按钮(更准确地说,是HtmlButton)并在不提交表单的情况下响应单击它:

服务器端(C#):

客户端(jQuery):

这个很好用

我可以在服务器端(用C#)为“提交”按钮完成所有操作,如下所示:

Button btnSave = new Button();
btnSave.Text = "Save";
btnSave.Click += new EventHandler(btnSave_Click);
this.Controls.Add(btnSave);
. . .

private void btnSave_Click(object sender, EventArgs e)
{
    . . . code elided for brevity
}
$(document).on("click", '[id$=btnGeneratePDF]', function () {
    $('[id$=pdfgenbtnclicked]').val("yes");
});
但问题的关键是,我需要在不提交表单的情况下响应按钮单击,然后在服务器端运行一些代码。我可以在jQuery中满足第一个要求(如上面使用HtmlButton btnAddFoapalRow所示),但我最终需要调用一些C代码来响应单击-我需要在服务器端执行一个操作

所以我的问题是:如何从客户端代码“戳”服务器端代码到“唤醒并调用此(某些)函数”

也许我可以更新我在C#中创建的变量(HiddenField),如下所示:

…来自jQuery,如下所示:

Button btnSave = new Button();
btnSave.Text = "Save";
btnSave.Click += new EventHandler(btnSave_Click);
this.Controls.Add(btnSave);
. . .

private void btnSave_Click(object sender, EventArgs e)
{
    . . . code elided for brevity
}
$(document).on("click", '[id$=btnGeneratePDF]', function () {
    $('[id$=pdfgenbtnclicked]').val("yes");
});
..然后在服务器端使用如下代码启动方法调用:

if (PDFGenBtnClicked.Value == "yes")
{
    GeneratePDF(listOfListItems);
}
…但是我怎样才能调用这(最后)段代码呢?我可以在页面上放置一个计时器,让它每隔一段时间检查pdfgenbtnicked.Value的状态吗?这也许是可能的,但几乎可以肯定的是戈德堡式的

谁有更好的主意

更新 理论上(我认为!)这应该是可行的(从客户端代码间接运行服务器端代码的非Ajax方式):

0)创建计时器

private Timer tmr = null;
1) 创建“生成PDF”按钮和计时器:

btnGeneratePDF = new HtmlButton();
btnGeneratePDF.Attributes["type"] = "button";
btnGeneratePDF.InnerHtml = "Generate PDF";
btnGeneratePDF.ID = "btnGeneratePDF ";
this.Controls.Add(btnGeneratePDF);

tmr = new Timer();
tmr.Interval = 3000; // three seconds
tmr.Tick += TickHandler; 
tmr.Enabled = true;
2) 当计时器跳闸时调用该方法:

private void TickHandler(object sender, object e)
{
    GeneratePDF(listOfListItems);
}
3) 如果用户选择了“生成PDF”按钮,请运行代码:

(我确实看到了短信,尽管它不是真的)

在两种方法中都使用断点:

private void TickHandler(object sender, object e)
{
    GeneratePDF(listOfListItems);
}

private void InitHandler(object sender, object e)
{
    GeneratePDF(listOfListItems);
}

…两者都没有联系到。为什么不呢?从理论上讲,这似乎应该是可行的…(我知道,理论上一切都是可行的)。

您的问题的简短回答是您必须使用ajax,jQuery提供了一些关于使用它的信息-

较长的答案是,您需要这样做:

$(文档)。在(“单击”、“[id$=btngeneratedf]”上,函数(){
$.get('/some/route/',函数(结果){
//根据你的需要,做一些有反应的事情,或者不做
}
});

我对Sharepoint不熟悉,因此我无法提供任何帮助,但最基本的是,您需要创建一个新页面,启动PDF生成并使用ajax访问它,然后以任何适当的方式处理结果。

您的问题的简短回答是,您必须使用ajax,jQuery提供了一些信息n关于使用它-

较长的答案是,您需要这样做:

$(文档)。在(“单击”、“[id$=btngeneratedf]”上,函数(){
$.get('/some/route/',函数(结果){
//根据你的需要,做一些有反应的事情,或者不做
}
});

我对Sharepoint不熟悉,因此无法提供任何帮助,但最基本的是,您需要创建一个新页面,启动PDF生成并使用ajax访问它,然后以任何适当的方式处理结果。

您希望实现的目标可以通过Web服务和ajax实现

Jquery.ajax可用于向Web服务(或网页,或其他任何内容)发送请求。以下是我的一个网站的示例:

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "FoamServices.asmx/GetFoamNames",
    data: "{'term':'" + $("#txtFoamName").val() + "'}",
    success: function (data) {
        //whatever you want to do with the data
    },
    error: function (result) {
        alert("Error");
    }
    });
关于这个例子的更多信息可以在上找到,但其要点是我有一个Web服务设置,FoamServices.asmx和该Web服务中的GetFoamNames方法。GetFoamNames使用“term”作为参数。成功后,我获取从该网站收到的数据并做我想做的事情(检查一个真值,将其注入页面,无论什么)

在服务器端,以下是我的Web服务:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]


[System.Web.Script.Services.ScriptService]
public class FoamServices : System.Web.Services.WebService {

public FoamServices () {

    //Uncomment the following line if using designed components 
    //InitializeComponent(); 
}

[WebMethod]
public string[] GetFoamNames(string term) {
    List<Foam> foams = Foam.Read(term);
    string[] foamNames = new string[foams.Count];
    for(int i = 0; i < foams.Count; i++)
    {
        foamNames[i] = foams[i].FoamName;
    }
    return foamNames;
}

}                        
[WebService(命名空间=”http://tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
公共类服务:System.Web.Services.WebService{
公共服务(){
//如果使用设计的组件,请取消注释以下行
//初始化组件();
}
[网络方法]
公共字符串[]GetFoamNames(字符串术语){
列表泡沫=泡沫。读取(术语);
string[]foamNames=新字符串[foams.Count];
对于(int i=0;i
这是webservice的基本设置,它还允许它接受来自javascript(JQuery)请求的参数

我的服务是根据数据库查询搜索词并返回结果。这是自动完成JQuery框的基本设置

您可以根据自己的喜好对其进行调整,也可以使用ajax来调用网页而不是webservice,并让它做一些事情


希望这有帮助!

您希望通过Web服务和ajax实现的目标

Jquery.ajax可用于向Web服务(或网页,或其他任何内容)发送请求。以下是我的一个网站的示例:

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "FoamServices.asmx/GetFoamNames",
    data: "{'term':'" + $("#txtFoamName").val() + "'}",
    success: function (data) {
        //whatever you want to do with the data
    },
    error: function (result) {
        alert("Error");
    }
    });
关于这个例子的更多信息可以在上找到,但其要点是我有一个Web服务设置,FoamServices.asmx和该Web服务中的GetFoamNames方法。GetFoamNames使用“term”作为参数。成功后,我获取从该网站收到的数据并做我想做的事情(检查一个真值,将其注入页面,无论什么)

在服务器端,以下是我的Web服务:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]


[System.Web.Script.Services.ScriptService]
public class FoamServices : System.Web.Services.WebService {

public FoamServices () {

    //Uncomment the following line if using designed components 
    //InitializeComponent(); 
}

[WebMethod]
public string[] GetFoamNames(string term) {
    List<Foam> foams = Foam.Read(term);
    string[] foamNames = new string[foams.Count];
    for(int i = 0; i < foams.Count; i++)
    {
        foamNames[i] = foams[i].FoamName;
    }
    return foamNames;
}

}                        
[WebService(命名空间=”http://tempuri.org/")]
[WebServiceBi]
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]


[System.Web.Script.Services.ScriptService]
public class FoamServices : System.Web.Services.WebService {

public FoamServices () {

    //Uncomment the following line if using designed components 
    //InitializeComponent(); 
}

[WebMethod]
public string[] GetFoamNames(string term) {
    List<Foam> foams = Foam.Read(term);
    string[] foamNames = new string[foams.Count];
    for(int i = 0; i < foams.Count; i++)
    {
        foamNames[i] = foams[i].FoamName;
    }
    return foamNames;
}

}                        
 <asp:ScriptManager runat="server" ID="sm">
 </asp:ScriptManager>
 <asp:updatepanel runat="server">
     <ContentTemplate>
         <asp:button id="YourButton" runat="server" Text="clickme" onclick="function" />
     </ContentTemplate>
 </asp:updatepanel>