我有一个简单的语言切换器,通过下拉列表,但我想切换到一个列表。据我所知,项目符号列表不支持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会删除错误"Object reference not set to an object instance“。有没有办法在我的项目列表中获取被点击的列表项目的值?这可能就是解决方案。
发布于 2012-08-04 04:42:37
有很多方法可以做到这一点,这取决于你的逻辑的其余部分,你可以在前端做如下简单的事情:
<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
}这应该是可行的。
https://stackoverflow.com/questions/11799158
复制相似问题