大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > ASP.NET技巧 > ASP.NET Web API Model-ModelMetadata

ASP.NET Web API Model-ModelMetadata(1)

关键词:WebNETASPModelMetadataMode  阅读(1318) 赞(15)

[摘要]本文是对ASP.NET Web API Model-ModelMetadata的讲解,对学习ASP.NET编程技术有所帮助,与大家分享。

在讲解Model绑定之前我还是先来讲解一下在Web API中的Model元数据,在我前面的ASP.NET MVC随笔系列汇总中对MVC框架中的Model的元数据有过讲解,对MVC有了解的朋友可以去看看,在ASP.NET Web API框架中的Model元数据的设计思想和MVC框架中的是一样的,都是对Model进行类型解析,然后已树形结构呈现或者是给需要它的地方使用。为什么说是树形结构呢?我们来看一下示例,后面再结合对象类型这么一讲解大家就差不多该明白了。

我们先不管在框架中是怎么表示的,先来看一下定义的Model:

示例代码1-1

    public class EmployeesInfo
    {
        [Display(Description="员工姓名")]
        public string Name { get; set; }

        [Display(Description = "员工年龄")]
        public int Age { get; set; }

        [Display(Description = "员工性别")]
        public string Sex { get; set; }

        [Display(Description = "员工地址信息")]
        public Address AddressInfo { get; set; }
    }

    
    public class Address
    {
        [Display(Description = "地址信息")]
        public string AddressInfo { get; set; }

        [Display(Description = "邮编")]
        public string ZipCode { get; set; }
    }

在代码1-1中我定义了一个Model类型为EmployeesInfo,表示员工的信息,在这其中有几个属性,其中AddressInfo属性是下面的Address类型,这里是为了说明Model元数据所表示的对象存在两种类型,一种是简单类型,另一种是复杂类型。至于这个类型怎么判断下面会说,我们还是先来看示例代码,看下Model经过框架生成为Model元数据过后包含的信息。

示例代码1-2

    public class MetadataController : ApiController
    {
        public string Get()
        {
            EmployeesInfo employeesInfo = new EmployeesInfo()
            {
                Name = "JinYuan",
                Age = 24,
                Sex = "男",
                AddressInfo = new Address()
                {
                    AddressInfo = "南京市",
                    ZipCode = "210000"
                }
            };
            ModelMetadata modelMetadata = this.Configuration.Services.GetModelMetadataProvider().GetMetadataForType(()=>employeesInfo, employeesInfo.GetType());
            StringBuilder strBuilder = new StringBuilder();
            ModelMetadataAnalysis(strBuilder, modelMetadata);
            return strBuilder.ToString();

        }

        private void ModelMetadataAnalysis(StringBuilder stringBuilder, ModelMetadata modelMetadata)
        {
            if (modelMetadata.IsComplexType == true)
            {
                foreach (var metadata in modelMetadata.Properties)
                {
                    ModelMetadataAnalysis(stringBuilder, metadata);
                }
            }
            else
            {
                stringBuilder.AppendLine(modelMetadata.Description).AppendLine("Value:" + modelMetadata.Model);
            }
        }
    }

在代码1-2中,我首先定义了一个控制器,并且定义了一个Get()方法,返回类型为string类型,然后在Get()方法中实例化Model,也就是我们代码1-1中的定义,在这之后我根据当前控制器基类所包含的HttpConfiguration类型的属性Configuration,从ServicesContainer 类型的Services属性中获取到Model元数据提供程序,从而使用这个提供程序来根据Model类型生成Model元数据,这里起初生成好的Model元数据也就是modelMetadata变量,它暂时只是一个类型的的表示,也就是EmployeesInfo类型,并且其中并不包含EmployeesInfo类型中属性的元数据,这里要注意的是不包含只是暂时的。

然后下面使用了一个方法ModelMetadataAnalysis(),首先判断当前的Model元数据表示的类型是不是复杂类型,如果是的话就读取这个Model元数据中的Properties属性,注意了在读取的时候,也就是ModelMetadataAnalysis()方法中的参数modelMetadata就会开始使用自身的Model元数据提供程序来生成自身所表示类型下属性的Model元数据。由此可以看到上面的代码实现中只是对简单类型进行了输出。我们看一下示意图。

图1

«上一页123下一页»


相关评论