我正在使用更新面板让我的部分页面异步更新。当Multiview更改其活动索引时,需要注册其导航。
例如,首次加载页面时,Multiview Active Index = 0。 当用户点击链接时,我会显示View索引1的内容。
允许用户使用浏览器历史记录前后移动非常重要。
ScriptManager
位于母版页中,其EnableHistory
属性设置为True
。
有人在使用Multiview时实现了它吗?
答案 0 :(得分:2)
我认为这应该可行,但你需要稍微定制一下。我正在做一些非常相似的事情,但由于我在其中嵌入了第三方控件的问题,我不得不放弃在updatepanel中使用multview。
您需要使用下面的asp.net标记在您的aspx文件中添加对Master页面的引用。此外,将scriptmanager作为公共控件公开在您的母版页中,以便您可以将事件连接到它。
在您网页的设计/ html代码中:更新主服务器的虚拟路径,或使用类型指定类型参考。
<%@ MasterType VirtualPath="~/MasterPage.master" %>
在您网页的初始化事件中:
public void Page_Init(object sender, EventArgs e)
{
// can be done at MasterPage level if you like
this.Master.ScriptManager.EnableHistory = true;
}
然后在你的页面的加载事件中:
protected void Page_Load(object sender, EventArgs e)
{
this.Master.ScriptManager.Navigate +=
new EventHandler<HistoryEventArgs>(ScriptManager_Navigate);
if (!this.IsPostBack && !ScriptManager.GetCurrent(this).IsInAsyncPostBack)
{
// load default multiview index
}
}
然后将此新事件处理程序添加到您的页面。将项目命名为“myArgs”,您应该使用更直观的内容。在我的实现中,我有一系列项目(如排序顺序,页面索引等,由delim分隔,然后将它们分解并分配)。
protected void ScriptManager_Navigate(object sender, HistoryEventArgs e)
{
if (!string.IsNullOrEmpty(e.State["myArgs"]))
{
string args = e.State["myArgs"];
SetMyArgs(args);
}
else
{
// just load default
}
}
args将是多视图索引。这些只是我使用的辅助函数。如果index是您唯一关心的项目,那么您可以将这些调用内联到主方法。
private void SetMyArgs(string args)
{
int myIndex = int.Parse(args);
// set multiview index here?
}
private string GetMyArgs()
{
return myMultiview.ActiveIndex.ToString();
}
然后,当您触发更改活动索引的事件时,将其添加到这些方法
if (this.IsAsync)
{
this.Master.ScriptManager.AddHistoryPoint("myArgs", GetMyArgs());
}
希望这会给你一些帮助。
答案 1 :(得分:0)
你不应该使用this.IsAsync
而是
ScriptManager.GetCurrent(Page).IsInAsyncPostBack
(或在您的情况下,this.Master.ScriptManager.IsInAsyncPostBack
)。