2012-09-18 29 views
0
//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> 

每当用户从英文更改为西班牙语时,我想显示一个警告框。 它是一个奇怪的行为,这段代码不工作,它不会显示任何警告框在选定的索引更改,但如果我粘贴警告框代码在页面加载事件它的作品。 pageload是否必须对此做任何事情? 其次,有可能记住答案,即如果用户选择了记住我的复选框,我应该记住用户是否在整个会话中选择了YES或NO。 关于第二个问题的任何建议将有所帮助。但请帮我找出上述代码无法按预期工作的原因。下拉菜单SelctIndexChange不按预期方式工作

回答

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

采取措施,它没有表现出任何警觉......我必须使用Page.ClientScript..If我只用ClientScript..it显示在目前的情况下不exsist .. – Scorpio

+0

该代码为我工作,做你会得到任何错误信息,并且你为下拉菜单设置了“AutoPostback = true”吗? – Raghuveer

+0

yep AutoPostBack =“True”无错误msg – Scorpio

1

注册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由于这种LIGNE

<script Type="text/javascript> 

function CheckLanguage(ddl) 
{ 
    return confirm("Are you sure to change language"); 
} 

</script> 
+0

不知道..现在OnSelectedIndexChanged =“ddlLanguage_SelectedIndexChanged”也不起作用。 – Scorpio

+0

你得到了javascript的消息吗?我们可能会缺少一些东西 – Adil

+0

雅我得到了味精 – Scorpio

1

按照预期的事件处理程序不工作

Server.Transfer(Request.Path); 

如果删除它可能或尝试工作以防万一,一切都会好的

编辑:

为了所造成的Server.Transfer问题得到试试这个,看看它是否让SENS

在你的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);     
} 
+0

我无法删除它的网页行为不一致。只有一半的控件更改为西班牙文.. – Scorpio

+0

对不起,请教您另一个问题......是否有解决此问题的方法? – Scorpio

+0

@Scorpio现在看看 –

1

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

我不认为你可以阻止SelectedIndexChanged回发,因为dot净增加了它自己的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); 
} 
+0

感谢所有的努力...有没有解决Server.Transfer(Request.Path)的问题; – Scorpio

+0

myHiddenButton_Click(object,System.EventArgs)'由于其保护级别而无法访问....再次卡住 – Scorpio

+0

可能应该是'protected void myHiddenButton_Click'我想。我在飞行中做了这个。挂钩它,但通常你会为一个按钮创建一个事件处理程序。 – lincolnk