[英]How can I invoke method in CircuitHandler of Blazor server-side?
[英]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.