网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

asp.netmvc2自定义DropdownList控件

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

asp.net mvc 2 给我们提供了强大的自定义功能,今天主要说下DropdownList自定义绑定字段显示,通过ViewData设定DropdownList的数据项。自动绑定显示。实现的方式。在global.asax 中注册 FieldTemplateMetadataProvider,

  1. ModelMetadataProviders.Current = new mvc.Models.FieldTemplateMetadataProvider(); 

通过返回的 FieldTemplateMetadata 。在MetaData中指定使用DropDownList的字段

  1. [Display( Name="",Order=12)] 
  2.         [Required] 
  3.         [SearchFilter] 
  4.         [DisplayName("栏目")] 
  5.         [DropDownList("Category""Id""Name")] 
  6.         public int Cid { getset; } 

通过DropDownList指定调用的模板为dropdownlist.ascx ,在dropdownlist.ascx 将默认的 ModelMetadata 转成FieldTemplateMetadata 获取 DropDownListAttribute 。

  1. <script runat="server"
  2.     DropDownListAttribute GetDropDownListAttribute() 
  3.     { 
  4.         FieldTemplateMetadata metaData = ViewData.ModelMetadata as FieldTemplateMetadata; 
  5.   
  6.         return (metaData != null) ? metaData.Attributes.OfType<DropDownListAttribute>().SingleOrDefault() : null
  7.     } 
  8. </script> 

通过DropDownListAttribute 获得 ViewData的key ,绑定的文本对应的字段,值对应的字段,使用html.DropDownlist显示数据
    DropdownList.ascx 代码

  1. <%@ Import Namespace="mvc.Models"%> 
  2. <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
  3. <script runat="server"
  4.     DropDownListAttribute GetDropDownListAttribute() 
  5.     { 
  6.         FieldTemplateMetadata metaData = ViewData.ModelMetadata as FieldTemplateMetadata; 
  7.  
  8.         return (metaData != null) ? metaData.Attributes.OfType<DropDownListAttribute>().SingleOrDefault() : null
  9.     } 
  10. </script> 
  11. <% DropDownListAttribute attribute = GetDropDownListAttribute();%> 
  12. <% if (attribute != null) {%> 
  13.     <%= Html.DropDownList(string.Empty, new SelectList(ViewData[attribute.ViewDataKey] as IEnumerable, attribute.DataValueField, attribute.DataTextField, Model), attribute.OptionLabel, attribute.HtmlAttributes) %> 
  14. <% }%> 
  15. <% else {%> 
  16.     <%= Html.DisplayForModel() %> 
  17. <% }%> 

自定义DropDownListAttribute 属性

  1. namespace mvc.Models 
  2.     using System; 
  3.     using System.Collections.Generic; 
  4.     using System.ComponentModel; 
  5.     using System.ComponentModel.DataAnnotations; 
  6.     using System.Linq; 
  7.     using System.Web.Routing; 
  8.  
  9.     [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
  10.     public sealed class DropDownListAttribute : Attribute, ITemplateField 
  11.     { 
  12.         private static string defaultTemplateName; 
  13.  
  14.         public DropDownListAttribute(string viewDataKey, string dataValueField) : this(viewDataKey, dataValueField, null
  15.         { 
  16.         } 
  17.  
  18.         public DropDownListAttribute(string viewDataKey, string dataValueField, string dataTextField) : this(viewDataKey, dataValueField, dataTextField, null
  19.         { 
  20.         } 
  21.  
  22.         public DropDownListAttribute(string viewDataKey, string dataValueField, string dataTextField, string optionLabel) : this(DefaultTemplateName, viewDataKey, dataValueField, dataTextField, optionLabel, null
  23.         { 
  24.         } 
  25.  
  26.         public DropDownListAttribute(string viewDataKey, string dataValueField, string dataTextField, string optionLabel, object htmlAttributes) : this(DefaultTemplateName, viewDataKey, dataValueField, dataTextField, optionLabel, htmlAttributes) 
  27.         { 
  28.         } 
  29.  
  30.         public DropDownListAttribute(string templateName, string viewDataKey, string dataValueField, string dataTextField, string optionLabel, object htmlAttributes) 
  31.         { 
  32.             if (string.IsNullOrEmpty(templateName)) 
  33.             { 
  34.                 throw new ArgumentException("Template name cannot be empty."); 
  35.             } 
  36.  
  37.             if (string.IsNullOrEmpty(viewDataKey)) 
  38.             { 
  39.                 throw new ArgumentException("View data key cannot be empty."); 
  40.             } 
  41.  
  42.             if (string.IsNullOrEmpty(dataValueField)) 
  43.             { 
  44.                 throw new ArgumentException("Data value field cannot be empty."); 
  45.             } 
  46.  
  47.             TemplateName = templateName; 
  48.             ViewDataKey = viewDataKey; 
  49.             DataValueField = dataValueField; 
  50.             DataTextField = dataTextField; 
  51.             OptionLabel = optionLabel; 
  52.             HtmlAttributes = new RouteValueDictionary(htmlAttributes); 
  53.         } 
  54.  
  55.         public static string DefaultTemplateName 
  56.         { 
  57.             get 
  58.             { 
  59.                 if (string.IsNullOrEmpty(defaultTemplateName)) 
  60.                 { 
  61.                     defaultTemplateName = "DropDownList"
  62.                 } 
  63.  
  64.                 return defaultTemplateName; 
  65.             } 
  66.             set 
  67.             { 
  68.                 defaultTemplateName = value; 
  69.             } 
  70.         } 
  71.  
  72.         public string TemplateName { getprivate set; } 
  73.  
  74.         public string ViewDataKey { getprivate set; } 
  75.  
  76.         public string DataValueField { getprivate set; } 
  77.  
  78.         public string DataTextField { getprivate set; } 
  79.  
  80.         public string OptionLabel { getprivate set; } 
  81.  
  82.         public IDictionary<stringobject> HtmlAttributes { getprivate set; } 
  83.  
  84.         public object GetSelectedValue(object model) 
  85.         { 
  86.             return GetPropertyValue(model, DataValueField); 
  87.         } 
  88.  
  89.         public object GetSelectedText(object model) 
  90.         { 
  91.             return GetPropertyValue(model, !string.IsNullOrEmpty(DataTextField) ? DataTextField : DataValueField); 
  92.         } 
  93.  
  94.         private static object GetPropertyValue(object model, string propertyName) 
  95.         { 
  96.             if (model != null
  97.             { 
  98.                 PropertyDescriptor property = GetTypeDescriptor(model.GetType()).GetProperties() 
  99.                                                                                 .Cast<PropertyDescriptor>() 
  100.                                                                                 .SingleOrDefault(p => string.Compare(p.Name, propertyName, StringComparison.OrdinalIgnoreCase) == 0); 
  101.                 
  102.                 if (property != null
  103.                 { 
  104.                     return property.GetValue(model); 
  105.                 } 
  106.             } 
  107.  
  108.             return null
  109.         } 
  110.  
  111.         private static ICustomTypeDescriptor GetTypeDescriptor(Type type) 
  112.         { 
  113.             return new AssociatedMetadataTypeTypeDescriptionProvider(type).GetTypeDescriptor(type); 
  114.         } 
  115.     } 

自定义DataAnnotationsModelMetadata

  1. public class FieldTemplateMetadata : DataAnnotationsModelMetadata 
  2.     { 
  3.         public FieldTemplateMetadata(DisplayAttribute aa, DataAnnotationsModelMetadataProvider provider, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName, DisplayColumnAttribute displayColumnAttribute, IEnumerable<Attribute> attributes) : base(provider, containerType, modelAccessor, modelType, propertyName, displayColumnAttribute) 
  4.         { 
  5.             Attributes = new List<Attribute>(attributes); 
  6.             Display = aa; 
  7.         } 
  8.  
  9.         public IList<Attribute> Attributes 
  10.         { 
  11.             get
  12.             private set
  13.         } 
  14.         public DisplayAttribute Display { getset; } 
  15.     } 

自定义 DataAnnotationsModelMetadataProvider

  1. public class FieldTemplateMetadataProvider : DataAnnotationsModelMetadataProvider 
  2.     { 
  3.         protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) 
  4.         { 
  5.             DataAnnotationsModelMetadata result = (DataAnnotationsModelMetadata) base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 
  6.  
  7.             string templateName = attributes.OfType<ITemplateField>() 
  8.                                             .Select(field => field.TemplateName) 
  9.                                             .LastOrDefault(); 
  10.             List<System.Attribute> attributeList = new List<System.Attribute>(attributes); 
  11.             DisplayAttribute disp = attributeList.OfType<DisplayAttribute>().FirstOrDefault(); 
  12.             if (disp != null
  13.             { 
  14.                 result.ShortDisplayName = disp.Order.ToString(); ; 
  15.                 result.Description = disp.Description; 
  16.             } 
  17.  
  18.             
  19.  
  20.             var data= (new FieldTemplateMetadata(disp, this, containerType, modelAccessor, modelType, propertyName, attributes.OfType<DisplayColumnAttribute>().FirstOrDefault(), attributes) 
  21.  
  22.                     { 
  23.                         TemplateHint = !string.IsNullOrEmpty(templateName) ? templateName : result.TemplateHint, 
  24.                         HideSurroundingHtml = result.HideSurroundingHtml, 
  25.                         DataTypeName = result.DataTypeName, 
  26.                         IsReadOnly = result.IsReadOnly, 
  27.                         NullDisplayText = result.NullDisplayText, 
  28.                         DisplayFormatString = result.DisplayFormatString, 
  29.                         ConvertEmptyStringToNull = result.ConvertEmptyStringToNull, 
  30.                         EditFormatString = result.EditFormatString, 
  31.                         ShowForDisplay = result.ShowForDisplay, 
  32.                         ShowForEdit = result.ShowForEdit, 
  33.                         DisplayName = result.DisplayName, 
  34.                         Description = result.Description, 
  35.                         ShortDisplayName = result.ShortDisplayName, 
  36.  
  37.                     }); 
  38.  
  39.             SearchFilterAttribute searchFilterAttribute = attributes.OfType<SearchFilterAttribute>().FirstOrDefault(); 
  40.             if (searchFilterAttribute != null
  41.             { 
  42.                 data.AdditionalValues.Add("Search", searchFilterAttribute); 
  43.             } 
  44.  
  45.             OrderByAttribute orderByAttribute = attributes.OfType<OrderByAttribute>().FirstOrDefault(); 
  46.             if (orderByAttribute != null
  47.             { 
  48.                 data.AdditionalValues.Add("OrderBy", orderByAttribute); 
  49.             } 
  50.             return data; 
  51.         } 
  52.     } 
设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师