【发布时间】: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