定制控件模板主题
你还可以在皮肤文件中应用模板属性与集合类似在皮肤文件中定义模板属性也不会应用在目标控件的模板的单独项上而是代替整个模板的内容这对于使用主题或StyleSheetTheme戏剧化地改变模板控件的布局时有用处的
Templateskin内容
<asp:Login runat=server>
<LayoutTemplate>
<i>Please log in to this site:</i><br /><br />
<asp:Label FontBold=true AssociatedControlID=UserName ID=UserNameLabel runat=server>User Name:</asp:Label>
<asp:TextBox ID=UserName runat=server></asp:TextBox>
<asp:RequiredFieldValidator ControlToValidate=UserName ErrorMessage=User Name is required ID=UserNameRequired runat=server ToolTip=User Name is required ValidationGroup=Login>*</asp:RequiredFieldValidator>
<asp:Label FontBold=true AssociatedControlID=Password ID=PasswordLabel runat=server>Password:</asp:Label>
<asp:TextBox ID=Password runat=server TextMode=Password></asp:TextBox>
<asp:RequiredFieldValidator ControlToValidate=Password ErrorMessage=Password is required ID=PasswordRequired runat=server ToolTip=Password is required ValidationGroup=Login>*</asp:RequiredFieldValidator>
<asp:Button CommandName=Login ID=LoginButton runat=server Text=Log In ValidationGroup=Login />
<asp:Literal EnableViewState=False ID=FailureText runat=server></asp:Literal>
</LayoutTemplate>
</asp:Login>
在主题中使用数据绑定和表达式
请注意在主题模板中使用<%# Eval %>或<%# Bind %>的数据绑定也是有效的但是不允许使用其它的代码数据绑定或表达式
Databindingskin内容
<asp:DataList RepeatColumns= CellPadding= runat=server>
<ItemTemplate>
<h><asp:Label ID=titleLabel runat=server Text=<%# Eval(title) %>/></h>
<asp:Image ImageUrl=<%# Eval(title_id Images/{}gif) %> runat=server />
<b>ID:</b>
<asp:Label ID=title_idLabel runat=server Text=<%# Eval(title_id) %>/><br />
<b>Type:</b>
<asp:Label ID=typeLabel runat=server Text=<%# Eval(type) %>/><br />
<b>Price:</b> $
<asp:Label ID=priceLabel runat=server Text=<%# Eval(price) %>/><br />
<asp:TextBox TextMode=MultiLine Rows= Columns= ID=notesLabel Text=<%# Eval(notes) %> runat=server/><br />
</ItemTemplate>
</asp:DataList>
主题和配置
你可能希望终端用户动态地为应用程序选择和应用主题通过把活动主题存储在用户配置中你可以根据用户的喜好动态的应用主题为了实现这种功能你需要编写代码来应用主题而不能使用@Page指令或Webconfig中宣告式的方法
在代码中指定主题
为了在代码中应用主题你必须在运行时设置Page(页面)对象的Theme属性在请求的生命周期的早期(在PreInit事件中)你就必须给页面应用主题在下面的例子中用户从下拉列表控件中选择主题名称的时候在PreInit事件中会动态地应用主题
<script runat=server>
Protected Sub Page_PreInit()
PageTheme = ServerHtmlEncode(RequestQueryString(Theme))
End Sub
</script>
使用ASPNET 中的配置(Profile)特性你可以把用户选择的主题存储起来并在用户登陆站点的时候读取它下面的例子演示了这种技术用户可以选择自己喜欢的颜色并存储配置文件接下来页面通过检索Profile对象中的主题名称应用这种颜色主题请注意如果你登出站点主题就存储为默认值(无主题)但是如果你返回该站点用户的选择就会保留
ProfileTheme_vbaspx的内容
<%@ Page Language=VB Theme=Default %>
<script runat=server>
Protected Sub Page_PreInit()
If Not ProfileFavoriteColor = Then
PageTheme = ProfileFavoriteColor
End If
End Sub
</script>
<asp:Label ID=Label runat=server Text=Welcome to my page Please login with User=Test Password=Test@></asp:Label><br />
<asp:Login ID=Login runat=server /><br />
<asp:LoginView ID=LoginView runat=server>
<LoggedInTemplate>
<asp:HyperLink ID=HyperLink NavigateUrl=Profile_csaspx Text=Edit Profile runat=server /><br />
<asp:LoginStatus ID=LoginStatus runat=server/>
</LoggedInTemplate>
</asp:LoginView>
Profile_vbaspx的内容
<script runat=server>
Protected Sub Page_Load(ByVal sender As Object ByVal e As SystemEventArgs)
If Not PageIsPostBack AndAlso Not ProfileFavoriteColor = Then
DropDownListDataBind()
End If
End Sub
Protected Sub Button_Click(ByVal sender As Object ByVal e As SystemEventArgs)
ProfileFavoriteColor = DropDownListSelectedValue
ResponseRedirect(ProfileTheme_csaspx)
End Sub
</script>
<b>Favorite Color:</b>
<asp:DropDownList ID=DropDownList SelectedValue=<%# ProfileFavoriteColor %> runat=server>
<asp:ListItem Value=OrangeTheme>Orange</asp:ListItem>
<asp:ListItem Value=GreenTheme>Green</asp:ListItem>
</asp:DropDownList>
<asp:Button ID=Button runat=server Text=Submit OnClick=Button_Click />
[] [] [] [] [] [] [] [] []