【问题标题】:Dropdown menu SelctIndexChange not working as expected下拉菜单 SelectIndexChange 未按预期工作
【发布时间】:2012-09-18 15:05:49
【问题描述】:
//master.cs     
protected void ddlLanguage_SelectedIndexChanged(object sender, EventArgs e)
    {
    //alert box
            string message = "Some Content of the Site are only in English. Do you want to continue?";
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append("return confirm('");
            sb.Append(message);
            sb.Append("');");
            Page.ClientScript.RegisterOnSubmitStatement(this.GetType(), "alert", sb.ToString());
       //alert end
            //Sets the cookie that is to be used by Global.asax
            HttpCookie cookie = new HttpCookie("CultureInfo");
            cookie.Value = ddlLanguage.SelectedValue;
            Response.Cookies.Add(cookie);

            //Set the culture and reload the page for immediate effect. 
            //Future effects are handled by Global.asax
            Thread.CurrentThread.CurrentCulture = new CultureInfo(ddlLanguage.SelectedValue);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(ddlLanguage.SelectedValue);
            Server.Transfer(Request.Path);
    }

//master  Page
<asp:DropDownList ID="ddlLanguage" class="langpnl" runat="server" AutoPostBack="True" 
        OnSelectedIndexChanged="ddlLanguage_SelectedIndexChanged">
        <asp:ListItem Value="en-US">Eng</asp:ListItem>
        <asp:ListItem Value="es-ES">Esp</asp:ListItem>
    </asp:DropDownList>

每当用户从英语更改为西班牙语时,我都想显示一个警告框。 这是一种奇怪的行为,此代码无法正常工作,它不会在所选索引更改时向我显示任何警报框,但是如果我将警报框代码粘贴到页面加载事件中,它会起作用。页面加载与此有关吗? 其次,是否有可能记住答案,即如果用户选择一个复选框说记住我,我应该记住用户在整个会话期间选择的是还是否。 关于第二个问题的任何建议都会有所帮助。但是请帮我找出上述代码没有按预期工作的原因。

【问题讨论】:

    标签: c# javascript drop-down-menu webforms


    【解决方案1】:

    在您的dropdownSelected index changed event 中尝试以下代码以显示警告框

    if (!ClientScript.IsStartupScriptRegistered("JSScript"))
                {
                    //give the exception details in a alert box
                    string sb = string.Format(@"<script>alert('{0}');</script>'", "Message to be shown");
                    ClientScript.RegisterStartupScript(this.GetType(), "JSScript", sb);
                }
    

    【讨论】:

    • 什么都没有显示任何警报...我必须使用 Page.ClientScript..如果我只使用 ClientScript..它显示在当前上下文中不存在..
    • 该代码对我有用,您是否收到任何错误消息,您是否为下拉菜单设置了AutoPostback = true
    【解决方案2】:

    onchange="return CheckLanguage(this);"而不是ClientScript.RegisterStartupScript注册javascript事件。

    HTML

    <asp:DropDownList ID="ddlLanguage" onchange="return CheckLanguage(this);" class="langpnl" runat="server" AutoPostBack="True" 
            OnSelectedIndexChanged="ddlLanguage_SelectedIndexChanged">
            <asp:ListItem Value="en-US">Eng</asp:ListItem>
            <asp:ListItem Value="es-ES">Esp</asp:ListItem>
        </asp:DropDownList>
    

    Javascript

    <script Type="text/javascript>
    
    function CheckLanguage(ddl)
    {
        return confirm("Are you sure to change language");
    }
    
    </script>
    

    【讨论】:

    • 不..现在 OnSelectedIndexChanged="ddlLanguage_SelectedIndexChanged" 也不起作用。
    • 您收到 javascript 消息了吗?我们可能会遗漏一些东西
    【解决方案3】:

    您在用户有机会确认之前将其发送到新页面。 Server.Transfer 请求一个新页面(即使它是相同的 url),所以你的 js 永远不会被写入页面。您需要在回发发生之前运行确认 js。

    我认为您也不能阻止 SelectedIndexChanged 回发,因为 dot net 添加了它自己的 js 事件处理程序来实现这一点。我认为这里最不显眼的方法是制作一个新按钮,将语言处理程序代码移动到按钮的单击处理程序,然后在用户确认选择时使用客户端 js 来单击按钮。

        <asp:DropDownList ID="ddlLanguage" class="langpnl" runat="server" AutoPostBack="False">
            <asp:ListItem Value="en-US">Eng</asp:ListItem>
            <asp:ListItem Value="es-ES">Esp</asp:ListItem>
        </asp:DropDownList>
        <asp:Button ID="myHiddenButton" runat="server" Style="display: none;" OnClick="myHiddenButton_Click" />
    
    
    void Page_PreRender(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string message = "Some Content of the Site are only in English. Do you want to continue?";
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append("if confirm('");
            sb.Append(message);
            sb.Append("') ");
            sb.AppendFormat("document.getElementById('{0}').click();", this.myHiddenButton.ClientID);
    
            //Page.ClientScript.RegisterOnSubmitStatement(this.GetType(), "alert", sb.ToString());
    
            // write your js as the client-side onchange handler on the ddl
            this.ddlLanguage.Attributes["onchange"] = sb.ToString();
    
            //alert end
        }
    
        this.myHiddenButton.Click += new EventHandler(myHiddenButton_Click);
    }
    
    void myHiddenButton_Click(object sender, EventArgs e)
    {
        // only ever called if user confirms the js prompt
    
        //Sets the cookie that is to be used by Global.asax
        HttpCookie cookie = new HttpCookie("CultureInfo");
        cookie.Value = ddlLanguage.SelectedValue;
        Response.Cookies.Add(cookie);
    
        //Set the culture and reload the page for immediate effect. 
        //Future effects are handled by Global.asax
        Thread.CurrentThread.CurrentCulture = new CultureInfo(ddlLanguage.SelectedValue);
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(ddlLanguage.SelectedValue);
        Server.Transfer(Request.Path);
    }
    

    【讨论】:

    • 感谢您的所有努力...Server.Transfer(Request.Path); 是否有任何解决方法
    • myHiddenButton_Click(object, System.EventArgs)' 由于其保护级别而无法访问....又卡住了
    • 我想应该是protected void myHiddenButton_Click。我在飞行中做了这个。将它连接起来,但是您通常会为按钮创建一个事件处理程序。
    • 你也不需要Server.Transfer的解决方法,在用户确认他们的选择之前你不能这样做。
    • 我不知道出了什么问题,但没有更多错误,仍然没有警报框...:(我想现在我会使用老式方法 Response.Write("");
    【解决方案4】:

    由于这种情况,您的事件处理程序无法按预期工作

    Server.Transfer(Request.Path);
    

    如果可能,将其删除或尝试工作,一切都会好起来的

    编辑:

    要解决由Server.Transfer 引起的问题,试试这个,看看它是否有意义

    在你的 aspx 文件中

    <asp:HiddenField runat="server" ID="hide" />
    

    在你的代码后面

    protected void Page_Load(object sender, EventArgs e)
    {
        if (hide.Value == "true")
        {
            Server.Transfer(Request.Path);
        }
        hide.Value = "";
    }   
    
    protected void ddlLanguage_SelectedIndexChanged(object sender, EventArgs e)
    {
        ...
    
        sb.Append("if(confirm('")
         .Append(message)
         .Append("')){")
         .AppendFormat("document.getElementById('{0}').value = 'true'", hide.ClientID)
         .Append("}");
    
         ...
    
         Thread.CurrentThread.CurrentCulture = new CultureInfo(ddlLanguage.SelectedValue);
         Thread.CurrentThread.CurrentUICulture = new CultureInfo(ddlLanguage.SelectedValue);                
     }
    

    【讨论】:

    • 我无法删除它,页面行为不一致。只有一半的控件更改为西班牙语..
    • 很抱歉再问你一个问题...有解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2018-07-04
    相关资源
    最近更新 更多