繁体   English   中英

如何从jQuery(Sharepoint 2010)调用服务器端事件?

[英]How can I invoke a server-side event from jQuery (Sharepoint 2010)?

在我的Sharepoint 2010应用程序中,我正在使用jQuery处理大多数客户端事件。 但是,为了将数据保存到Sharepoint列表,并使用该数据生成PDF文件,我想使用C#处理该服务器端。

我试图通过这种方式调用C#事件:

0)在项目的* .ascx文件中添加了HTML按钮:

<button type="button" name="saveData" id="saveData">Save Data</button>

1)添加了jQuery以响应被单击的按钮(在同一* .ascx文件中):

$("#saveData").click(function () {
      $('#hiddenSave').trigger('valuechanged');
  });

2)在服务器端C#中创建一个隐藏元素(在* .ascx.cs文件中):

HiddenField hiddenSave = null;

protected void Page_Load(object sender, EventArgs e)
{
    base.OnPreRender(e);

    hiddenSave = new HiddenField();
    hiddenSave.ID = "hiddenSave";
    hiddenSave.ValueChanged += new EventHandler(hiddenSave_ValueChanged);
    this.Controls.Add(hiddenSave);
}

protected void hiddenSave_ValueChanged(object sender, EventArgs e)
{
    GeneratePDF();
}

private void GeneratePDF()
{
    ;//bla
}

但是我从来没有到达“ ValueChanged”事件处理程序。 $(“#saveData”)。click()会触发,但hiddenSave_ValueChanged()不会触发。

那么,我需要对此进行调整还是完全不同的方法? 如何在Sharepoint 2010应用程序中使用jQuery尽可能多地在客户端执行操作,又在必要时运行服务器端/ C#代码?

更新

更多细节,以及我尝试过的其他事情:我正在* .ascx.cs文件中动态(在C#中)在Sharepoint页面上创建一个按钮:

Button btnSave = null;

protected void Page_Load(object sender, EventArgs e)
{
    base.OnPreRender(e);    

    this.Controls.Add(new LiteralControl("<br />"));
    btnSave = new Button();
    btnSave.ID = "btnSave";
    btnSave.Text = "Save the Data"; 
    btnSave.Click += new EventHandler(btnSave_Click);
    btnSave.Visible = false;
    this.Controls.Add(btnSave);
}

protected void btnSave_Click(object sender, EventArgs e)
{
    btnSave.Text = "You clicked me!"; 
    PostTravelData ptd = new PostTravelData();
}

我在适当的时候将它设置为在* .ascx文件的客户端jQuery中可见:

$('#btnSave').show();

但是,单击按钮不会到达btnSave_Click()事件-永远不会到达该断点,也不会更改按钮的文本。 为什么不?

即使我没有将按钮设置为不可见(在“ btnSave.Visible = false;”行中添加注释),也没有到达单击处理程序... Page_Load()是否为时已晚? 我可以使用较早的页面事件吗?

我也尝试将其从Page_Load()移到OnPreRender(),如下所示:

protected void OnPreRender(EventArgs e)
{
    this.Controls.Add(new LiteralControl("<br />"));
    btnSave = new Button();
    btnSave.ID = "btnSave";
    btnSave.Text = "Save the Data";
    btnSave.Click += new EventHandler(btnSave_Click);
    //btnSave.Visible = false;
    this.Controls.Add(btnSave);
}

...(和OnRender()),但按钮甚至不显示...

并且,尝试使用另一种方法,我注释掉了动态创建服务器端代码,并尝试将其附加到在HTML(*。ascx文件)中创建的按钮上:

<button type="button" name="saveData" id="saveData" runat="server" onclick="saveData_Click">Save Data</button>

(通过添加“运行服务器”和onclick处理程序),然后添加此“代码隐藏”(* .ascx.cs)):

protected void saveData_Click(object sender, EventArgs e)
{
    PostTravelData ptd = new PostTravelData();
    SaveToList(ptd);
    GeneratePDF(ptd);
}        

...但是Mudville仍然没有欢乐-尚未达到处理程序中的断点。

另一个尝试是:

在* .ascx中:

<asp:Button runat="server" id="saveData" name="saveData" onclick="saveData_Click" Text="Bla" />

在后面的代码中:

saveData.Click += saveData_Click;

创建了“ Bla”按钮,但是单击它并没有到达“ saveData_Click”处理程序中的断点。

我什至从这里修改了一些代码,如下所示:

Button btnSave = null;

. . .

protected override void CreateChildControls()
{
    btnSave = new Button();
    btnSave.Width = new Unit(150, UnitType.Pixel);
    btnSave.Text = "Can you see me?";
    btnSave.Click += new EventHandler(btnSave_Click);
    Controls.Add(btnSave);
}

...但是当我单击按钮时,我仍然没有达到“受保护的无效btnSave_Click(object sender,EventArgs e)”处理程序。

当然,有一种方法可以在按钮服务器端获取一个句柄并对其进行操作(特别是响应其click事件)...?!?

首先,据我所知,在ascx页面中没有隐藏输入类型的事件。 如果您在ascx代码中使用runat server创建隐藏的输入类型,那么当您尝试添加此事件时,您会看到它不可用。 但是,您还可以模拟其他事件,例如OnClick,以获得所需的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM