【问题标题】:How can I invoke a server-side event from jQuery (Sharepoint 2010)?如何从 jQuery (Sharepoint 2010) 调用服务器端事件?
【发布时间】:2015-12-12 05:31:56
【问题描述】:

在我的 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>

(通过添加“runat server”和 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”处理程序中的断点。

我什至像这样改编了here 的一些代码:

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);
}

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

肯定有办法在按钮服务器端获取句柄并对其进行操作(特别是响应其点击事件)...?!?

【问题讨论】:

  • 您考虑过使用客户端 API 吗?这里有更多信息(微软链接,所以可能会在没有重定向的情况下被移动......):msdn.microsoft.com/en-us/library/office/…
  • 谢谢,但我想在需要的地方保留服务器端代码;我只需要一种同时使用两者的方法。

标签: c# jquery html sharepoint-2010


【解决方案1】:

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

【讨论】:

  • 您能否添加更多细节 - 您如何模拟 OnClick()?我一直在尝试我能想到的一切......请查看我的更新以了解我的一些尝试。
  • 请在页面后面附上整个 ascx + 代码。仅使用 sn-p 就很难知道需要修复什么。您可以像这里所说的那样调用单击:stackoverflow.com/questions/11518529/… 但是,即使“直接”单击事件没有触发,这样做也没有任何意义。添加页面,让我们看看你有什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 2021-05-21
相关资源
最近更新 更多