c# - 为什么在 Javascript 中附加事件处理程序会阻止我的服务器端事件触发?

标签 c# asp.net javascript

我从事 C# 工作已有多年,但从事 ASP.NET 工作的时间并不长,这让我感到困惑。

在我的故障排除示例中,我的 ASP.NET 页面中有一个下拉列表,其中有四个项目,我有一个在 selectedindexchanged 上触发的服务器端事件,在这种情况下一切都很好。

但是,如果(正如我在我的进化代码中所做的那样)我为“onchange”事件设置了一个Javascript处理程序,(它启动了一个警报)警报工作正常,但服务器端事件不再触发...我确信我错过了一些明显的东西。

重要说明:Autopostback 在下拉列表控件上设置为 true, View 状态已启用,Javascript 事件处理程序返回 true

有人吗?

这并不是说我必须手动连接 __doPostBack 是吗?

非常感谢任何帮助。

编辑

好的,这是代码,首先是代码隐藏

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;

namespace TestEvents
{
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected override void OnPreRender(EventArgs e)
    {

        ClientScriptManager csm = Page.ClientScript;
        if (!csm.IsClientScriptBlockRegistered("NotesChangeScript"))
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("\r\n <script type=\"text/javascript\"> \r\n");
            sb.Append(" //<![CDATA[ \r\n");
            sb.Append(" var changesCount = 0; \r\n");

            sb.Append(" function selection_handler()\r\n");
            sb.Append("{ \r\n");
            sb.Append(" changesCount += 1;\r\n");
            sb.Append(" alert('i changed on the client!'); \r\n");
            sb.Append(" return true; \r\n");
            sb.Append(" } \r\n");

            sb.Append(" function SetUpNotesHandler() \r\n");
            sb.Append("{ \r\n");
            sb.Append("          var ctrls = document.getElementsByTagName(\"SELECT\");\r\n");
            sb.Append("          for(i=0;i<ctrls.length;i++)\r\n");
            sb.Append("                  {\r\n");
            sb.Append("                     ctrls[i].onchange = selection_handler; \r\n");
            sb.Append("                 }\r\n");
            sb.Append("}\r\n");


            sb.Append(" //]]> \r\n");
            sb.Append("</script>");

            csm.RegisterClientScriptBlock(this.GetType(), "NotesChangeScript", sb.ToString(), false);

            StringBuilder initScript = new StringBuilder();
            initScript.Append("<script type=\"text/javascript\" >\r\n");
            initScript.Append(" //<![CDATA[\r\n");
            initScript.Append("  SetUpNotesHandler(); \r\n");
            initScript.Append(" //]]> \r\n");
            initScript.Append("</script> \r\n");
            csm.RegisterStartupScript(this.GetType(), "StartUpKey", initScript.ToString(),false);
            base.OnPreRender(e);
        }

    }
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Response.Write("i hit the server event");
    }
}

}

这是页面的标记

<%@ Page Language="C#" AutoEventWireup="true"     CodeBehind="Default.aspx.cs"    Inherits="TestEvents._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>problem</title>
</head>
<body>
<form id="form1" runat="server">
<div>
    <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
        <asp:ListItem>Numero Uno</asp:ListItem>
        <asp:ListItem>Numer Deux</asp:ListItem>
        <asp:ListItem>Number Three</asp:ListItem>
        <asp:ListItem>Nomina Quatros</asp:ListItem>
    </asp:DropDownList>
    <asp:HiddenField ID="hdnFieldChange" runat="server" />
</div>
</form>
</body>
</html>

最佳答案

如果您的 Javascript 事件处理程序取消事件冒泡,则由 asp.net 插入的调用您的服务器端代码的事件处理程序将不会运行。

我不熟悉 asp.net auto-inserted-things,并且您还没有发布事件处理程序的代码,因此我无法准确告诉您如何解决该问题。我的建议是使用 jQuery 附加事件处理程序,而不是返回 false 或以更详细的方式取消事件冒泡。

关于c# - 为什么在 Javascript 中附加事件处理程序会阻止我的服务器端事件触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/598954/

相关文章:

javascript - 在 javascript 中触发点击事件有效,但实际的 asp.net 事件没有被触发

c# - 最高效的 C# SharePoint 列表迭代

javascript - 多次调用类构造函数

java - 无法在 Chrome 上将大型 html 内容发布到服务器

javascript - 此示例中存在什么类型的继承(原型(prototype)除外)

c# - Datagrid:如何获取 SelectedItem 的 CurrentCell?

c# - C# 的 DocuSign 和 PDF/ITextSharp 定位问题

java - 在这种情况下自签名证书更好吗?

c# - c# WebAPI 中的异常处理程序

c# - IEnumerable 模型中的多个 DropDownList