MVC如何绑定复杂类型的页面Model

  页面绑定简单类型的model时,可以在控制器里直接拿到页面绑定的model中post回来的值,但是如果一个model是复杂类型,比如model中有另一个自定义对象,这样的model就无法在控制器里面直接获取到值了。

  这时候就只能按层次的获取每个层次的值,具体如何实现代码如下:

 public class SimpleModelBinder:IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            object model = this.GetModel(controllerContext, bindingContext.ModelType, bindingContext.ValueProvider, bindingContext.ModelName);
            if (bindingContext.FallbackToEmptyPrefix && null == model)
            {
                model = this.GetModel(controllerContext, bindingContext.ModelType, bindingContext.ValueProvider, "");

            }
            return model;
        }

        public object GetComplexModel(ControllerContext controllerContex,Type modelType,IValueProvider valueProvider,string prefix)
        {
            object oModel = CreateModel(modelType);
            PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(modelType);
            foreach (PropertyDescriptor pd in pdc)
            {
                if (pd.IsReadOnly)
                {
                    continue;
                }
                string key = string.IsNullOrEmpty(prefix) ? pd.Name : prefix + "." + pd.Name;

                pd.SetValue(oModel,GetModel(controllerContex,pd.PropertyType,valueProvider,key));
            }
            return oModel;
        }

        public virtual object GetModel(ControllerContext controllerContext,Type modelType,IValueProvider valueProvider,string key) {
            if (!valueProvider.ContainsPrefix(key))
            {
                return null;
            }
            ModelMetadata modelMeatadata = ModelMetadataProviders.Current.GetMetadataForType(null, modelType);
            if (!modelMeatadata.IsComplexType)
            {
                return valueProvider.GetValue(key).ConvertTo(modelType);
            }
            if(modelMeatadata.IsComplexType)
            {
                return GetComplexModel(controllerContext, modelType, valueProvider, key);
            }
            return null;
        }

        private object CreateModel(Type modelType)
        {
            Type type = modelType;
            if (modelType.IsGenericType)
            {
                Type genericTypeDefinition = modelType.GetGenericTypeDefinition();
                if (genericTypeDefinition == typeof(IDictionary<,>))
                {
                    type = typeof(Dictionary<,>).MakeGenericType(modelType.GetGenericArguments());
                }
                else if (((genericTypeDefinition == typeof(IEnumerable<>)) || (genericTypeDefinition == typeof(ICollection<>))) || (genericTypeDefinition == typeof(IList<>)))
                {
                    type = typeof(List<>).MakeGenericType(
                     modelType.GetGenericArguments());
                }
            }
            return Activator.CreateInstance(type);
        }

    }

然后

 [ModelBinder(typeof(SimpleModelBinder))]
    public class RoleModel
    {
        public string RoleName { set; get; }
        public string RoleDescription { set; get; }
        public string RoleExistId { set; get; }

        public UserMangerModle userManagerModel { set; get; }
......
}就可以通过遍历各层属性就行复杂类型值的获取了。。。
时间: 2024-10-12 12:31:18

MVC如何绑定复杂类型的页面Model的相关文章

mvc数据模型绑定

模型绑定(Model Binding)是使用浏览器发起Http请求时的数据创建.NET对象的过程.我们每一次定义带参数的action方法时就已经依靠了模型绑定——这些参数对象是通过模型绑定创建的.这一章会介绍模型绑定的原理以及针对高级使用必要的定制模型绑定的技术. 理解模型绑定(Understanding Model Binding) 想象下我们创建了一个控制器如下: using System; using System.Web.Mvc; using MvcApp.Models; namespa

二、Springmvc+Mybatis 参数绑定之默认参数绑定 简单类型绑定 POJO绑定 POST乱码问题

web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/

ASP.NET MVC——模型绑定

这篇文章我们来讲讲模型绑定(Model Binding),其实在初步了解ASP.NET MVC之后,大家可能都会产生一个疑问,为什么URL片段最后会转换为例如int型或者其他类型的参数呢?这里就不得不说模型绑定了.模型绑定是指,用浏览器以HTTP请求方式发送的数据来创建.NET对象的过程.每当定义具有参数的动作方法时,一直是在依赖着这种模型绑定过程. 准备项目 我们先来创建一个MVC项目,名叫MVCModels,并在Models文件夹中创建一个新的类文件Person. 1 using Syste

[转] ASP.NET MVC 模型绑定的功能和问题

摘要:本文将与你深入探究 ASP.NET MVC 模型绑定子系统的核心部分,展示模型绑定框架的每一层并提供扩展模型绑定逻辑以满足应用程序需求的各种方法. 同时,你还会看到一些经常被忽视的模型绑定技术,并了解如何避免一些最常见的模型绑定错误. ASP.NET MVC 模型绑定通过引入自动填充控制器操作参数的抽象层.处理通常与使用 ASP.NET 请求数据有关的普通属性映射和类型转换代码来简化控制器操作. 虽然模型绑定看起来很简单,但实际上是一个相对较复杂的框架,由许多共同创建和填充控制器操作所需对

MVC模型绑定

视图: 1 @model RegisterViewModel 2 @{ 3 ViewData["Title"] = "Register"; 4 } 5 6 <h2>@ViewData["Title"]</h2> 7 8 <div class="row"> 9 <div class="col-md-4"> 10 <form asp-route-return

ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)

前面文章介绍了ASP.NET MVC中的模型绑定和验证功能,本着ASP.NET MVC没有魔法的精神,本章内容将从代码的角度对ASP.NET MVC如何完成模型的绑定和验证进行分析,已了解其原理. 本文的主要内容有: ● ModelBinder ● ValuePrivoder ● ModelMetadata ● 简单模型与复杂模型 ● 小结 ModelBinder ModelBinder是ASP. NET MVC用于模型绑定的核心组件,所有的ModelBinder都实现了IModelBinder

Spring MVC资源绑定视图解析器

ResourceBundleViewResolver使用属性文件中定义的视图bean来解析视图名称. 以下示例显示如何使用Spring Web MVC框架中的ResourceBundleViewResolver. ResourceBundleViewResolver-servlet.xml 配置如下所示 - <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> <p

MVC验证11-对复杂类型使用jQuery异步验证

原文:MVC验证11-对复杂类型使用jQuery异步验证 本篇体验使用"jQuery结合Html.BeginForm()"对复杂类型属性进行异步验证.与本篇相关的"兄弟篇"包括: MVC验证08-jQuery异步验证    MVC验证09-使用MVC的Ajax.BeginForm方法实现异步验证    MVC验证10-到底用哪种方式实现客户端服务端双重异步验证 准备工作 □ js方面:1.jquery的某个版本2.jquery.validate.js3.jquery

C# 中 datagridview 绑定BindingList类型和更新

C# 中的datagridview是一个非常有用且强大的控件,可以用来绑定数据库.绑定LIST类型的变量等等. 这里我们说一说绑定List类型并实时更新datagridview的情况.实时更新,指的是在我操作BindingList时(删除/Add)等操作的时候,datagridview也会发生相应变化. 想要达到此种目的,需要达成以下几个条件: 1.datagridview的datasource被指定为BindingList类型 2.在datagridview的编辑列中,将列里面的datapro