asp.net mvc 2 DisplayTemplates 的使用
asp.net mvc 2 官方给的例子有些简单,主要介绍了新的功能。下面主要介绍下DisplayTemplates 给我们带来的实用的功能,可以自定义字段显示的方式,按类型分:String、Boolean、Decimal。按显示的方式:EmailAddress、Html、Url、HiddenInput。还可以自定义字段的显示 如:DropDownList。可以扩充类型的显示 如:DateTime,只要和字段的类型相同都可以直接使用,而不用绑定。下班一个简单的MetaData的例子。它可以扩充数据模型,定义一些自定义的内容。
1 [MetadataType(typeof(Article_MetaData))]
2 partial class Article
3 {
4
5 }
6 public class Article_MetaData
7 {
8
9 [ScaffoldColumn(false)]
10 public int Id { get; set;}
11 [DisplayName("标题")]
12 [Required]
13 [SearchFilter]
14 public string title { get; set; }
15
16 [Display( Name="",Order=12)]
17 [Required]
18 [SearchFilter]
19 [DisplayName("栏目")]
20 [DropDownList("Category", "Id", "Name")]
21 public int Cid { get; set; }
22 [DisplayName("模型")]
23 [ScaffoldColumn(false)]
24 public int ModeId { get; set; }
25 [DisplayName("排序")]
26 [Required]
27 public int OrderID { get; set; }
28 [DisplayName("时间")]
29 [Required]
30 public DateTime CreateTime { get; set; }
31
32 [DisplayName("内容")]
33 [DataType(DataType.Html)]
34 public string Cont { get; set; }
35 }
2 partial class Article
3 {
4
5 }
6 public class Article_MetaData
7 {
8
9 [ScaffoldColumn(false)]
10 public int Id { get; set;}
11 [DisplayName("标题")]
12 [Required]
13 [SearchFilter]
14 public string title { get; set; }
15
16 [Display( Name="",Order=12)]
17 [Required]
18 [SearchFilter]
19 [DisplayName("栏目")]
20 [DropDownList("Category", "Id", "Name")]
21 public int Cid { get; set; }
22 [DisplayName("模型")]
23 [ScaffoldColumn(false)]
24 public int ModeId { get; set; }
25 [DisplayName("排序")]
26 [Required]
27 public int OrderID { get; set; }
28 [DisplayName("时间")]
29 [Required]
30 public DateTime CreateTime { get; set; }
31
32 [DisplayName("内容")]
33 [DataType(DataType.Html)]
34 public string Cont { get; set; }
35 }
关于MetaData的详细内容可以参考msdn上的介绍。mvc 对MetaData内的部分内容支持不是太完善,有些内容还需要自己来扩展。如[Display()]就不能使用,如果使用的话,你必须自定义 ModelMetadataProviders。通过它,你可以实现很多功能。
DisplayTemplates 文件夹内的自定义控件只针对html.display() 使用。下边说下,我使用的自定义表格,先将表格用分头部,和主体内容两部分,分别是 header、Rows。
header.ascx代码
1 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
2 <script runat="server">
3 bool ShouldShow(ModelMetadata metadata) {
4 return metadata.ShowForDisplay
5 && metadata.ModelType != typeof(System.Data.EntityState)
6 && !metadata.IsComplexType
7 && !ViewData.TemplateInfo.Visited(metadata);
8 }
9 </script>
10 <% if (Model == null) { %>
11 <%= ViewData.ModelMetadata.NullDisplayText %>
12 <% } else if (ViewData.TemplateInfo.TemplateDepth > 1) { %>
13 <%= ViewData.ModelMetadata.SimpleDisplayText %>
14 <% } else { %>
15
16 <% foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => ShouldShow(pm))) { %>
17 <% if (prop.HideSurroundingHtml) { %>
18 <%= Html.Display(prop.PropertyName) %>
19 <% }
20 else if (prop.DataTypeName != "Html" && prop.DataTypeName != "MultilineText" && prop.DataTypeName != "Text")
21 { %>
22 <% if (!String.IsNullOrEmpty(prop.GetDisplayName())) { %>
23 <th><%= prop.GetDisplayName() %></th>
24 <% } %>
25
26 <% } %>
27 <% } %>
28
29
30 <% } %>
2 <script runat="server">
3 bool ShouldShow(ModelMetadata metadata) {
4 return metadata.ShowForDisplay
5 && metadata.ModelType != typeof(System.Data.EntityState)
6 && !metadata.IsComplexType
7 && !ViewData.TemplateInfo.Visited(metadata);
8 }
9 </script>
10 <% if (Model == null) { %>
11 <%= ViewData.ModelMetadata.NullDisplayText %>
12 <% } else if (ViewData.TemplateInfo.TemplateDepth > 1) { %>
13 <%= ViewData.ModelMetadata.SimpleDisplayText %>
14 <% } else { %>
15
16 <% foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => ShouldShow(pm))) { %>
17 <% if (prop.HideSurroundingHtml) { %>
18 <%= Html.Display(prop.PropertyName) %>
19 <% }
20 else if (prop.DataTypeName != "Html" && prop.DataTypeName != "MultilineText" && prop.DataTypeName != "Text")
21 { %>
22 <% if (!String.IsNullOrEmpty(prop.GetDisplayName())) { %>
23 <th><%= prop.GetDisplayName() %></th>
24 <% } %>
25
26 <% } %>
27 <% } %>
28
29
30 <% } %>
rows.ascx 代码
代码
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<script runat="server">
bool ShouldShow(ModelMetadata metadata)
{
return metadata.ShowForDisplay
&& metadata.ModelType != typeof(System.Data.EntityState)
&& !metadata.IsComplexType
&& !ViewData.TemplateInfo.Visited(metadata);
}
</script>
<% if (Model == null) { %>
<%= ViewData.ModelMetadata.NullDisplayText %>
<% } else if (ViewData.TemplateInfo.TemplateDepth > 1) { %>
<%= ViewData.ModelMetadata.SimpleDisplayText %>
<% } else { %>
<% foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => ShouldShow(pm))) {
%>
<% if (prop.HideSurroundingHtml) { %>
<%= Html.Display(prop.PropertyName) %>
<% } else if(prop.DataTypeName!="Html"&&prop.DataTypeName!="MultilineText"&&prop.DataTypeName!="Text") { %>
<td><%= Html.Display(prop.PropertyName) %></td>
<% } %>
<% } %>
<% } %>
<script runat="server">
bool ShouldShow(ModelMetadata metadata)
{
return metadata.ShowForDisplay
&& metadata.ModelType != typeof(System.Data.EntityState)
&& !metadata.IsComplexType
&& !ViewData.TemplateInfo.Visited(metadata);
}
</script>
<% if (Model == null) { %>
<%= ViewData.ModelMetadata.NullDisplayText %>
<% } else if (ViewData.TemplateInfo.TemplateDepth > 1) { %>
<%= ViewData.ModelMetadata.SimpleDisplayText %>
<% } else { %>
<% foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => ShouldShow(pm))) {
%>
<% if (prop.HideSurroundingHtml) { %>
<%= Html.Display(prop.PropertyName) %>
<% } else if(prop.DataTypeName!="Html"&&prop.DataTypeName!="MultilineText"&&prop.DataTypeName!="Text") { %>
<td><%= Html.Display(prop.PropertyName) %></td>
<% } %>
<% } %>
<% } %>
调用表格使用的代码
代码
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Admin.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<%@ Import Namespace="mvc.Models" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<div id="headImg">
<img src="/content/adminimages/01.gif" alt="" /><%:ViewData["NavTitle"]%>
</div>
<div id="cont2">
<div class="form clearfix">
<form id="form1" method="get">
<div id="Search" class="clearfix">
<%=Html.DisplayFor(m => ViewData["searchModel"], "tool","")%>
<li class="add">
<%: Html.ActionLink("添加", "Add") %>
</li>
</div>
</form>
<table class="tb">
<% int i = 0; foreach (var art in Model)
{
i++;
if (i == 1)
{
%>
<tr class="tbhead">
<%=Html.DisplayFor(m => art, "header", "di")%>
<th>操作</th>
</tr>
<%} %>
<tr>
<%=Html.DisplayFor(m => art, "rows", "di")%>
<td style="width:60px">
<%: Html.ActionLink("编辑", "Edit", new { id = art.Id })%> <%: Html.ActionLink("删除", "Delete", new { id = art.Id }, new { onclick = "return confirm('你确定要删除吗?')" })%>
</td>
</tr>
<%} %>
</table>
<div class="page">
<%=ViewData["page"] %>
</div>
</div>
</div>
</asp:Content>
<%@ Import Namespace="mvc.Models" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<div id="headImg">
<img src="/content/adminimages/01.gif" alt="" /><%:ViewData["NavTitle"]%>
</div>
<div id="cont2">
<div class="form clearfix">
<form id="form1" method="get">
<div id="Search" class="clearfix">
<%=Html.DisplayFor(m => ViewData["searchModel"], "tool","")%>
<li class="add">
<%: Html.ActionLink("添加", "Add") %>
</li>
</div>
</form>
<table class="tb">
<% int i = 0; foreach (var art in Model)
{
i++;
if (i == 1)
{
%>
<tr class="tbhead">
<%=Html.DisplayFor(m => art, "header", "di")%>
<th>操作</th>
</tr>
<%} %>
<tr>
<%=Html.DisplayFor(m => art, "rows", "di")%>
<td style="width:60px">
<%: Html.ActionLink("编辑", "Edit", new { id = art.Id })%> <%: Html.ActionLink("删除", "Delete", new { id = art.Id }, new { onclick = "return confirm('你确定要删除吗?')" })%>
</td>
</tr>
<%} %>
</table>
<div class="page">
<%=ViewData["page"] %>
</div>
</div>
</div>
</asp:Content>
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------