(摘要)ASP.NET CustomRender 控件
时间:2011-03-26 来源:木野狐(Neil Chen)
想要继续使用 webforms, 但又想能比较大程度的操控控件生成的 html 细节时,可以考虑用这个控件。将需要自定义 render html 的控件放到其 ControlTemplate 下。然后在 designer 界面点一下 "Update HtmlTemplate",控件就会在 design time 去进行 render, 并且把结果自动放到 HtmlTemplate 属性中;然后,只要对该 HtmlTemplate 里面的内容进行调整,就可以操控 html 生成的细节。
举例来说,一个传统的 DataGrid 控件在经过此转换后,代码可以定制成如下 html:
<i88:CustomRender runat="server" ID="c1"> <ControlTemplate> <asp:DataGrid ID="dg1" runat="server" SelectedItemStyle-BackColor="Red" AutoGenerateColumns="false" SelectedIndex="1" SelectedItemStyle-CssClass="selected" DataSource='<%# DummyData %>'> <Columns> <asp:BoundColumn DataField="Name" /> <asp:ButtonColumn DataTextField="Price" DataTextFormatString="{0:c}" CommandName="Select" /> </Columns> </asp:DataGrid> </ControlTemplate> <HtmlTemplate> <% for (int i = 0; i < dg1.Items.Count; i++) { // enumerate the DataGrid's items so we can choose how to render them var item = dg1.Items[i]; // the ButtonColumn is rendering a LinkButton or Button var priceLink = (IButtonControl)item.Cells[1].Controls[0]; %> <ul class="item<%= dg1.SelectedIndex == i ? " selected" : "" %>"> <li><%= item.Cells[0].Text %></li> <li class='price' onclick="<%= Page.GetPostBackEventReference((Control)priceLink) %>"> <%= priceLink.Text %> </li> </ul> <% } %> </HtmlTemplate> </i88:CustomRender>
模板的语法可以非常类似 asp.net mvc 的写法。一个 DataGrid 控件经此转换后,变成了用 <ul> 布局,并且每一行甚至可以横过来排。只需要加一点小小的 CSS:
<style type="text/css"> ul.item { float: left; list-style-type: none; padding: 0px 10px 0px 10px; } ul.selected { border: solid 1px red; } li.price { cursor: pointer; color: Blue; text-decoration: underline; } </style>
下载此控件的地址:http://archive.msdn.microsoft.com/aspnetcustomrender/Release/ProjectReleases.aspx?ReleaseId=2914
Blog 原文地址:
http://weblogs.asp.net/infinitiesloop/archive/2009/07/01/asp-net-webforms-taking-back-the-html.aspx
相关阅读 更多 +