我正在开发一个ASP.net应用程序,我应该在第一次登录时向用户显示选择语言Popup(用户可以选择语言的简单屏幕)。我尝试从InitializeCulture事件调用PopUp,但是在加载主页面之后出现PopUp。
我希望在加载页面之前显示PopUp。一旦用户从PopUp中选择语言,我希望页面以该语言显示。
我使用以下代码调用PopUp
Page.ClientScript.RegisterStartupScript(typeof(Page), "onload", script);
答案 0 :(得分:2)
让用户重定向到选择语言页面。然后重定向到该网站。您还可以检查页面加载以确保已选择语言或重定向到页面。
答案 1 :(得分:2)
为了解释乍得的回应,有助于理解ASP.NET Page Life Cycle的核心。特别是,当第一次从服务器请求aspx页面时(即不是回发后),IIS会识别.aspx扩展名并将其交给ASP.NET引擎进行渲染。 ASP.NET引擎首先实例化代码隐藏类,执行任何预渲染方法或事件(Init,Page_Load,PreRender等),并处理所有非HTML标记('<%... .aspx文件中的%>'和'')。完成所有这些操作后,它将具有完整的HTML页面,然后在HTTP响应中返回到浏览器。
这里的重点是,在您的Page_Load或任何其他服务器端代码完成之前,浏览器永远不会看到任何HTML,包括RegisterStartupScript代码。
另一种可能的解决方案是使用MultiView,它在一个视图中显示语言选择UI,在另一个视图中显示实际页面内容。语言选择现在将通过控件直接在页面上完成而不是在弹出窗口中完成。在Page_Load中,检查是否已选择某种语言,如果没有,则显示第一个视图。在用户选择他们的语言之后,将回发提交给第二次调用Page_Load的服务器(这次是IsPostBack为真)。然后,根据用户的选择在代码中设置语言,并切换到包含主页内容的第二个视图。通过将MultiView包装在UpdatePanel中,您可以获得更好的用户体验,这样您就可以获得AJAX回发而不是整页回复。
因此,Page_Load中的基本逻辑看起来像这样(使用C#语法):
if (!IsPostBack) {
string userLang = SomehowGetSelectedLanguageFromUserProfile(); // You provide
if (String.IsNullOrEmpty(userLang) {
PopulateLanguageComboBox(); // You provide
multiView1.ActiveView = 0;
} else {
DoAnyWorkNecessaryToRenderPageInSpecifiedLanguage(userLang); // You provide
multiView1.ActiveIndex =1;
}
} else {
if (multiView.ActiveView == 0)
{
if (comboLangSelect.SelectedIndex <= 0) {
lblErrorMessage.Text = "You must select a language to continue";
lblErrorMessage.Visible = true;
} else {
DoAnyWorkNecessaryToRenderPageInSpecifiedLanguage(comboLangSelect.SelectedValue);
multiView1.ActiveIndex =1;
}
} else {
// Any other PostBack processing required for the main page.
}
}
请注意,我在回复框中完全写了这个,并没有编译或以任何方式测试它。它只是为了向您提供我建议的解决方案背后的一般逻辑。
如果你真的需要在弹出窗口中进行语言选择,可以完成,但是你需要让弹出窗口将结果传回主页面窗口并手动回发结果到服务器。这有点复杂,但有可能。