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>

ユーザーが英語からスペイン語に変わるたびに、アラートボックスを表示したいと思います。奇妙な動作です。このコードは機能していません。選択したインデックスの変更時にアラートボックスが表示されませんが、ページの読み込みイベントにアラートボックスコードを貼り付けると機能します。ページロードはこれと何か関係がありますか?次に、答えを覚えることができます。つまり、ユーザーが「覚えておいてください」というチェックボックスを選択した場合、セッション全体でユーザーが「はい」または「いいえ」を選択したかどうかを覚えておく必要があります。2番目の質問に関する提案があれば役立ちます。しかし、上記のコードが期待どおりに機能しない理由を見つけるのを手伝ってください。

4

4 に答える 4

1

このリグが原因で、イベントハンドラーが期待どおりに機能していません

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);                
 }
于 2012-09-18T15:25:38.413 に答える
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);
            }
于 2012-09-18T15:09:34.337 に答える
1

onchange="return CheckLanguage(this);"の代わりにjavascriptイベントを登録し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>
于 2012-09-18T15:14:28.763 に答える
1

ユーザーが確認する前に、ユーザーを新しいページに送ります。Server.Transfer(同じURLであっても)新しいページをリクエストするので、jsがページに書き込まれることはありません。ポストバックが発生する前に、confirmjsを実行する必要があります。

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);
}
于 2012-09-18T15:31:35.253 に答える