簡體   English   中英

下拉菜單SelctIndexChange無法正常工作

[英]Dropdown menu SelctIndexChange not working as expected

//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>

每當用戶從英語更改為西班牙語時,我都想顯示一個警報框。 這是一種怪異的行為,此代碼無法正常工作,在選擇的索引更改上沒有顯示任何警報框,但是如果我將警報框代碼粘貼到頁面加載事件中,它將起作用。 頁面加載與此有關嗎? 其次,可以記住答案,即,如果用戶選中一個復選框“記住我”,則我應該記住用戶在整個會話中是選擇是還是否。 關於第二個問題的任何建議都將有所幫助。 但是,請幫助我找到上述代碼無法按預期運行的原因。

在您的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);
            }

使用onchange="return CheckLanguage(this);"注冊javascript事件onchange="return CheckLanguage(this);" 而不是ClientScript.RegisterStartupScript

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>

由於此問題,您的事件處理程序無法正常工作

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);                
 }

您正在將用戶發送到新頁面,然后他們才有機會進行確認。 Server.Transfer請求一個新頁面(即使它是相同的URL),因此您的js永遠不會寫入該頁面。 您需要在回發發生之前運行確認js。

我認為您也不能阻止SelectedIndexChanged回發,因為點網會添加自己的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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM