[英]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.