ASP.NET非Razor环境下C#调用JS函数并获取返回值的方法
如何在ASP.NET WebForms中获取JavaScript函数的返回值
首先明确核心逻辑:服务器端C#代码与客户端JS代码是先后执行的——C#先在服务器生成页面内容(包括JS)发送到浏览器,浏览器才会执行JS。因此无法直接同步获取JS函数的返回值,必须通过**回传(PostBack)**的方式将JS的值传递给服务器端。
以下针对你的两种场景给出具体实现方案:
场景1:获取已有JS函数(如$.retorno())的返回值
步骤1:添加服务器端隐藏域
在ASPX页面中添加一个HiddenField控件,用于存储JS函数的返回值:
<asp:HiddenField ID="hfJsReturnValue" runat="server" />
步骤2:注册JS代码存入值并触发回传
在C#后台代码中,注册JS代码将$.retorno()的结果写入隐藏域,然后触发页面回传:
// 拼接JS代码:获取返回值→存入隐藏域→触发回传 string jsScript = $@" var retornoValor = $.retorno(); document.getElementById('{hfJsReturnValue.ClientID}').value = retornoValor; __doPostBack('{hfJsReturnValue.UniqueID}', '');"; // 注册并执行这段JS ScriptManager.RegisterStartupScript(Page, Page.GetType(), "GetJsRetorno", jsScript, true);
步骤3:服务器端读取返回值
在Page_Load事件中,判断是否为回传请求,读取隐藏域的值:
protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { string jsRetorno = hfJsReturnValue.Value; // 根据返回值执行后续逻辑 if (jsRetorno == "Não") { // 执行取消操作 } else if (jsRetorno == "Sim") { // 执行确认操作 } } }
场景2:获取用户交互(如Bootstrap模态框选择)后的返回值
针对你代码中的模态框确认场景,修改按钮逻辑,将用户选择存入隐藏域后触发回传:
步骤1:添加确认结果的隐藏域
<asp:HiddenField ID="hfConfirmacao" runat="server" />
步骤2:修改模态框JS代码
调整按钮的点击事件,将用户选择的值写入隐藏域并触发回传:
StringBuilder mensagem = new StringBuilder(); mensagem.Append("BootstrapDialog.show({closable: false,"); mensagem.Append("type: BootstrapDialog.TYPE_WARNING,"); mensagem.Append("title: 'Material',"); mensagem.Append("message: 'Existem ordens separadas para este material.<br><br>Deseja prosseguir com a gravação?',"); // 确认按钮(Sim):存入值并回传 mensagem.Append("buttons: [{id: 'btnConfirarGravacao',"); mensagem.Append("icon: 'glyphicon glyphicon-ok-sign',"); mensagem.Append("label: 'Sim',"); mensagem.Append("action: function (dialog) {"); mensagem.Append("dialog.close();"); mensagem.Append($"document.getElementById('{hfConfirmacao.ClientID}').value = 'Sim';"); mensagem.Append($"__doPostBack('{hfConfirmacao.UniqueID}', '');"); mensagem.Append("}},"); // 取消按钮(Não):存入值并回传 mensagem.Append("{id: 'btnCancelarGravacao',"); mensagem.Append("icon: 'glyphicon glyphicon-ban-circle',"); mensagem.Append("label: 'Não',"); mensagem.Append("action: function (dialog) {"); mensagem.Append("dialog.close();"); mensagem.Append($"document.getElementById('{hfConfirmacao.ClientID}').value = 'Não';"); mensagem.Append($"__doPostBack('{hfConfirmacao.UniqueID}', '');"); mensagem.Append("}}]});"); ScriptManager.RegisterStartupScript(Page, Page.GetType(), "mensagemModalSimples", mensagem.ToString(), true);
步骤3:服务器端处理用户选择
在Page_Load中读取隐藏域的值,执行对应逻辑:
protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { string confirmacao = hfConfirmacao.Value; if (!string.IsNullOrEmpty(confirmacao)) { if (confirmacao == "Sim") { // 执行ContinuaGravacao对应的服务器端逻辑 } else if (confirmacao == "Não") { // 执行取消操作的逻辑 } } } }
注意事项
- 确保
__doPostBack函数存在:WebForms页面默认会生成该函数,若未生成,可通过添加<asp:ScriptManager runat="server" />控件确保其被注册。 - 隐藏域的
ClientID:WebForms会根据命名容器生成带前缀的客户端ID,必须用ClientID获取浏览器端的实际ID,避免找不到元素。 - 回传触发:
__doPostBack可指定回传的目标控件,也可直接触发整页回传,根据需求调整。
内容的提问来源于stack exchange,提问作者Thomaz Henrique
相关产品推荐
相关产品推荐

