如何在 ASP.NET 中使用 JavaScript 回发到服务器
这是“如何在 ASP.NET 中使用 JavaScript 回发到服务器”的替代方案
引言
原文中的代码效果很好,可以从 JavaScript 触发回发。但是,它不允许你从 JavaScript 传递一个变量参数。我对代码进行了一些小的修改,使其能够从 JavaScript 传递一个字符串变量到后台代码。
背景
基本上,正如 Scott Norberg 在他的原始文章中所指出的,https://codeproject.org.cn/Articles/42183/How-to-post-back-to-the-server-using-JavaScript-in,我们试图避免使用 __doPostback
从 javascript 在 .Net 中触发回发,而是使用文档化的 .Net 框架类 "PostBackOptions
" 来触发回发。这个代码的扩展允许从 JavaScript 传递一个变量。
使用代码
这是我的修改(我的代码是用 VB)。第一步是编写一个小的 EventArg 类
Public Class JavaScriptPostbackEventArgs
Inherits EventArgs
Public args As String = ""
Public Sub New(args As String)
Me.args = args
End Sub
End Class
接下来,更改回发事件的类型以使用这个新的类
Public Event Postback As EventHandler(Of JavaScriptPostbackEventArgs)
现在接下来的任务是让 JavaScript 传递一个字符串变量。这是通过更改 Render
方法来实现的
第一步是向选项添加一个参数
options.Argument = "arg"
接下来,也将其作为变量添加到 javascript 函数调用中
writer.Write([String].Format("{0} = function(arg) {1}", functionName__1, "{"))
当 GetPostBackEventReference
渲染时,arg 是一个字符串值,而不是一个变量。以下代码将移除 arg 上的单引号,并使用变量
writer.Write(Me.Page.ClientScript.GetPostBackEventReference(options).Replace("'arg'", "arg"))这是完整的
Render
方法Protected Overrides Sub Render(writer As HtmlTextWriter)
MyBase.Render(writer)
Dim options As New PostBackOptions(PostbackButton)
options.PerformValidation = Me.CausesValidation
options.ValidationGroup = Me.ValidationGroup
options.Argument = "arg"
Dim functionName__1 As [String] = If(JavaScriptNamespaces.Equals([String].Empty), FunctionName, [String].Concat(JavaScriptNamespaces, ".", FunctionName))
Dim arg As String = "e"
writer.Write("<script type='text/javascript'>")
AddNamespaces(JavaScriptNamespaces, writer)
writer.Write([String].Format("{0} = function(arg) {1}", functionName__1, "{"))
writer.Write(Me.Page.ClientScript.GetPostBackEventReference(options).Replace("'arg'", "arg"))
writer.Write("};")
writer.Write("</script>")
Me.Page.ClientScript.RegisterForEventValidation(options)
End Sub
现在最后,引发回发事件将从请求中获取 EventArgument
Private Sub PostbackButton_Click(sender As Object, e As EventArgs)
RaiseEvent Postback(sender, New JavaScriptPostbackEventArgs(HttpContext.Current.Request("__EVENTARGUMENT")))
End Sub
所有修改都完成了。
使用示例
这是一个如何在客户端使用它的示例。将控件添加到页面标记
<uc:JavascriptPostBack runat="Server" ID="ucPostback" FunctionName="javaPostback" />
一个简单的 javascript 示例来调用该函数是:你可以在另一个函数中使用它。
<script>
javaPostback('test');
</script>
最后是处理该事件的后台代码
Private Sub ucJavascriptpostback_Postback(sender As Object, e As JavaScriptPostbackEventArgs) Handles ucNodeClickPostback.Postback
End Sub
在上面的示例中,e.args 将具有值 'test'。