|
asp.net mvc 2 给我们提供了强大的自定义功能,今天主要说下DropdownList自定义绑定字段显示,通过ViewData设定DropdownList的数据项。自动绑定显示。实现的方式。在global.asax 中注册 FieldTemplateMetadataProvider,
ModelMetadataProviders.Current = new mvc.Models.FieldTemplateMetadataProvider();
通过返回的 FieldTemplateMetadata 。在MetaData中指定使用DropDownList的字段
[Display( Name="",Order=12)]
[Required]
[SearchFilter]
[DisplayName("栏目")]
[DropDownList("Category", "Id", "Name")]
public int Cid { get; set; }
通过DropDownList指定调用的模板为dropdownlist.ascx ,在dropdownlist.ascx 将默认的 ModelMetadata 转成FieldTemplateMetadata 获取 DropDownListAttribute 。
<script runat="server">
DropDownListAttribute GetDropDownListAttribute()
{
FieldTemplateMetadata metaData = ViewData.ModelMetadata as FieldTemplateMetadata;
return (metaData != null) ? metaData.Attributes.OfType<DropDownListAttribute>().SingleOrDefault() : null;
}
</script>
通过DropDownListAttribute 获得 ViewData的key ,绑定的文本对应的字段,值对应的字段,使用html.DropDownlist显示数据
DropdownList.ascx 代码
<%@ Import Namespace="mvc.Models"%>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<script runat="server">
DropDownListAttribute GetDropDownListAttribute()
{
FieldTemplateMetadata metaData = ViewData.ModelMetadata as FieldTemplateMetadata;
return (metaData != null) ? metaData.Attributes.OfType<DropDownListAttribute>().SingleOrDefault() : null;
}
</script>
<% DropDownListAttribute attribute = GetDropDownListAttribute();%>
<% if (attribute != null) {%>
<%= Html.DropDownList(string.Empty, new SelectList(ViewData[attribute.ViewDataKey] as IEnumerable, attribute.DataValueField, attribute.DataTextField, Model), attribute.OptionLabel, attribute.HtmlAttributes) %>
<% }%>
<% else {%>
<%= Html.DisplayForModel() %>
<% }%>
自定义DropDownListAttribute 属性
namespace mvc.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Routing;
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class DropDownListAttribute : Attribute, ITemplateField
{
private static string defaultTemplateName;
public DropDownListAttribute(string viewDataKey, string dataValueField) : this(viewDataKey, dataValueField, null)
{
}
public DropDownListAttribute(string viewDataKey, string dataValueField, string dataTextField) : this(viewDataKey, dataValueField, dataTextField, null)
{
}
public DropDownListAttribute(string viewDataKey, string dataValueField, string dataTextField, string optionLabel) : this(DefaultTemplateName, viewDataKey, dataValueField, dataTextField, optionLabel, null)
{
}
public DropDownListAttribute(string viewDataKey, string dataValueField, string dataTextField, string optionLabel, object htmlAttributes) : this(DefaultTemplateName, viewDataKey, dataValueField, dataTextField, optionLabel, htmlAttributes)
{
}
public DropDownListAttribute(string templateName, string viewDataKey, string dataValueField, string dataTextField, string optionLabel, object htmlAttributes)
{
if (string.IsNullOrEmpty(templateName))
{
throw new ArgumentException("Template name cannot be empty.");
}
if (string.IsNullOrEmpty(viewDataKey))
{
throw new ArgumentException("View data key cannot be empty.");
}
if (string.IsNullOrEmpty(dataValueField))
{
throw new ArgumentException("Data value field cannot be empty.");
}
TemplateName = templateName;
ViewDataKey = viewDataKey;
DataValueField = dataValueField;
DataTextField = dataTextField;
OptionLabel = optionLabel;
HtmlAttributes = new RouteValueDictionary(htmlAttributes);
}
(责任编辑:admin) |