0

ドロップダウンリストから簡単な言語スイッチャーを使用していますが、リストに切り替えたいと思います。私の知る限り、AutoPostBackは箇条書きではサポートされておらず、PostBackプロパティでのみサポートされています。この場合、ポストバックを使用すると、スイッチャーが機能しなくなります。これを乗り越える方法はありますか?

<asp:DropDownList ID="cmbCulture" runat="server" AutoPostBack="True"
        OnSelectedIndexChanged="cmbCulture_SelectedIndexChanged"
        CssClass="lang_switcher"
        DisplayMode="LinkButton">
    <asp:ListItem Value="de-DE">DE</asp:ListItem>
    <asp:ListItem Value="en-US">EN</asp:ListItem>
</asp:DropDownList>

そしてここにコードがあります:

public partial class MasterPage : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            HttpCookie cultureCookie = Request.Cookies["Culture"];
            string cultureCode = (cultureCookie != null) ? cultureCookie.Value : null;
            if (!string.IsNullOrEmpty(cultureCode))
            {
                cmbCulture.SelectedValue = cultureCode;
            }
        }
    }
    protected void cmbCulture_SelectedIndexChanged(object sender, EventArgs e)
    {
        //Save Current Culture in Cookie- will be used in InitializeCulture in BasePage
        Response.Cookies.Add(new HttpCookie("Culture", cmbCulture.SelectedValue));
        Response.Redirect(Request.Url.AbsolutePath); //Reload and Clear PostBack Data
    }
}

だから私は次のようなことを達成したいと思います:

フロントエンド:

 <asp:BulletedList ID="cmbCulture" runat="server" PostBack="True" OnSelectedIndexChanged="cmbCulture_SelectedIndexChanged" DisplayMode="LinkButton">
            <asp:ListItem Value="en-US">EN</asp:ListItem>
            <asp:ListItem Value="de-DE">DE</asp:ListItem>
        </asp:BulletedList>

バックエンド:

public partial class MasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
  {
    HttpCookie cultureCookie = Request.Cookies["Culture"];
    string cultureCode = (cultureCookie != null) ? cultureCookie.Value : null;
    if (!string.IsNullOrEmpty(cultureCode))
    {
       cmbCulture.SelectedItem.Value = cultureCode;
    }
  }
}
protected void cmbCulture_SelectedIndexChanged(object sender, EventArgs e)
{
//Save Current Culture in Cookie- will be used in InitializeCulture in BasePage
Response.Cookies.Add(new HttpCookie("Culture", cmbCulture.SelectedItem.Value));
Response.Redirect(Request.Url.AbsolutePath); //Reload and Clear PostBack Data
}
}

SelectedItem.Valueは、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーをドロップします。箇条書きでクリックされたリストアイテムの値を取得する方法はありますか?これが解決策かもしれません。

4

1 に答える 1

3

これを行う方法はたくさんありますが、ロジックの残りの部分に応じて、フロントエンドでこれと同じくらい簡単に行うことができます。

<ul>
    <li><asp:HyperLink ID="hypDE" runat="server" Text="DE" NavigateUrl="yourpage.aspx?culture=DE" /></li>
    <li><asp:HyperLink ID="hypUS" runat="server" Text="US" NavigateUrl="yourpage.aspx?culture=US" /></li>
</ul>

また、yourpage.aspxのコードビハインドでは、次のようにして適切なカルチャを設定できます。

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        string culture = Request.QueryString["culture"];
    }
}

しかし、それを行うにはもっと多くの方法があります。リストビュー、リピーターなど、基本的に任意のデータコントロールを使用できます...

たとえば、xmlファイルやデータベースなどからサイトカルチャーをロードすることでこれをより動的にすることを検討している場合は、データコントロールを使用する必要があります。リピーターの例を次に示します。

フロントエンド:

<asp:Repeater ID="repCultures" runat="server" OnItemDataBound="repCultures_ItemDataBound">
    <HeaderTemplate>
        <ul>
    </HeaderTemplate>
        <li>
            <asp:HyperLink ID="hypCulture" runat="server" />
        </li>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

バックエンド:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        //This is where you would get your cultures out of an xml or database
        //I'm using a non-dynamic list to make a simple representation
        List<string> cultures = new List<string>() { "de-DE", "en-US", "en-UK" };
        repCultures.DataSource = cultures;
        repCultures.DataBind();
    }
}

protected void repCultures_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        string culture = e.Item.DataItem as string;
        HyperLink hypCulture = e.Item.FindControl("hypCulture") as HyperLink;
        hypCulture.Text = culture;
        hypCulture.NavigateUrl = string.Format("~/yourpage.aspx?culture={0}", culture);
    }
}

次に、yourpage.aspxで、必要なカルチャをフェッチするためのクエリ文字列を使用します。

繰り返しになりますが、これを行うには非常に多くの方法があるので、これがうまくいかない場合は、プロジェクトについてもう少し教えてください。より良い方法を提案します。

うまくいけば、これがお役に立てば幸いです。

編集:

まず、イベントを次のように変更します。

フロントエンド:

<asp:BulletedList ID="cmbCulture" runat="server" OnClick="cmbCulture_Click" DisplayMode="LinkButton">

バックエンド:

protected void cmbCulture_Click(object sender, BulletedListEventArgs e)
{
    //Save Current Culture in Cookie- will be used in InitializeCulture in BasePage
    Response.Cookies.Add(new HttpCookie("Culture", cmbCulture.Items[e.Index].Value));
    Response.Redirect(Request.Url.AbsolutePath); //Reload and Clear PostBack Data
}

これはうまくいくはずです。

于 2012-08-03T20:42:37.023 に答える