13.2 WebPart管理器
WebPartManager对象是页面上所有WebPart的操作控制器,任何有WebPart的页面都必须有一个WebPartManager。在页面上放一个WebPartManager实例后,这个管理器会维护WebPart和区域(zone)的一个列表,管理页面状态和个性化,并管理WebPart之间的通信。最简单的形式是只需向页面增加这个控件:
<asp:WebPartManager ID="WebPartManager1" runat="server" />
WebPartManager不显示UI,而且无需设置任何属性,它会在底层为你管理WebPart。图13-1中所示的所有内容都由用户控件或服务器控件(可以是标准服务器控件或定制服务器控件)来管理,并置于页面上的“区域”(zone)中。页面上还可以放其他内容,但是区域中只能是用户控件或服务器控件(实际上,文本等其他内容也是允许的,不过在此忽略)。
只有一个地方需要写代码,就是要编写代码来控制页面的当前状态。默认状态只是浏览页面,你会原样看到内容,不过为了支持定制,还有其他状态:
q 设计(Design),可以在区域之间移动WebPart,还可以最小化甚至隐藏WebPart。
q 编辑(Edit),可以修改WebPart的特性,如边框、标题,等等。
q 连接(Connect),可以把WebPart连接起来,允许信息从一个WebPart流向另一个WebPart。
q Catalog(编目),可以看到隐藏的WebPart,或者是可用但未在页面上显示的WebPart。
可以把WebPartManager的DisplayMode属性设置为某个集合值来改变页面的当前状态,最容易的办法就是利用一个列表,如代码清单13-1所示。
代码清单13-1 一个WebPart页面定制菜单
<asp:DropDownList ID="WebPartMenu" runat="server"
AutoPostBack="true" OnSelectedIndexChanged="MenuChanged">
<asp:ListItem value="EditDisplayMode"
Text="Personalize the page" />
<asp:ListItem value="BrowseDisplayMode"
Text="Browse the page" Selected="true" />
<asp:ListItem value="CatalogDisplayMode"
Text="Show Catalog" />
<asp:ListItem Value="ConnectDisplayMode"
Text="Connect WebParts" />
<asp:ListItem Value="DesignDisplayMode"
Text="Design the page" />
</asp:DropDownList>
在回送事件中设置DisplayMode属性,如代码清单13-2所示。
代码清单13-2 设置页面的DisplayMode
protected void MenuChanged(object sender, EventArgs e)
{
switch (WebPartMenu.SelectedValue)
{
case "DesignDisplayMode":
WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode;
break;
case "EditDisplayMode":
WebPartManager1.DisplayMode = WebPartManager.EditDisplayMode;
break;
case "BrowseDisplayMode":
WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode;
break;
case "CatalogDisplayMode":
WebPartManager1.DisplayMode = WebPartManager.CatalogDisplayMode;
break;
case "ConnectDisplayMode":
WebPartManager1.DisplayMode = WebPartManager.ConnectDisplayMode;
break;
}
}
有意思的是,DisplayMode不是一个枚举。这里所用的值是WebPartManager的公共静态字段,类型为WebPartDisplayMode。这样就允许模式根据需要设置不同的属性。
你可能希望为菜单系统增加一些智能,而不是永远都显示所有选项,或者只显示某些用户可用的特定选项。这很重要,因为个性化只针对认证用户,所以很容易将菜单与一个LoginView控件结合,或者甚至可以在代码中构造菜单,使用WebPart的更高级特性来指示允许哪些模式。例如,代码清单13-3就动态构造了一个菜单。
代码清单13-3 动态构造WebPart菜单
_manager = WebPartManager.GetCurrentWebPartManager(Page);
String browseModeName = WebPartManager.BrowseDisplayMode.Name;
// Fill the dropdown with the names of supported display modes.
foreach (WebPartDisplayMode mode in _manager.SupportedDisplayModes)
{
String modeName = mode.Name;
// Make sure a mode is enabled before adding it.
if (mode.IsEnabled(_manager))
{
ListItem item = new ListItem(modeName + " Mode", modeName);
DisplayModeDropdown.Items.Add(item);
}
}
GetCurrentWebPartManager静态方法用于得到页面上WebPartManager的一个引用。尽管可以直接访问WebPartManager,但如果为菜单使用一个定制服务器控件或用户控件,这个方法会很有用。WebPartManager有一个名为SupportedDisplayModes的属性,其中包含当前支持的模式集合,这里考虑了该用户是否已经认证(如果未认证,则只支持浏览模式)。所支持的各个模式提供了一个Name属性,利用各模式的Name属性在菜单中构造了一个ListItem。
代码清单13-4显示了如何使用WebPartDisplayMode属性来简化DisplayMode的设置,这里去除了分支语句。
代码清单13-4 由动态菜单改变DisplayMode
protected void DisplayModeDropdown_SelectedIndexChanged(
object sender, EventArgs e)
{
String selectedMode = DisplayModeDropdown.SelectedValue;
WebPartDisplayMode mode =
_manager.SupportedDisplayModes[selectedMode];
if (mode != null)
_manager.DisplayMode = mode;
}
代码清单13-3和13-4中所示的方法不仅简化了代码,还把菜单处理抽象到一个单独的包中。







