一、前言

用过MVC的兄弟们都知道,MVC有模型绑定表单提交的数据功能,那么我也想偷个懒也写个WebForm版的模型绑定。这里主要定义一个泛型方法,然后通过反射把表单上对应属性名字的值赋值到反射创建类的属性上。

使用注意的地方

1、定义的模型类的属性名要和表单name的名字相对应

2、定义的泛型方法是通过 var form = context.Request.Form;   表单 POST过来的数据

二、代码实现

public class DataModel
{

    /// <summary>
    /// 从表单提交的数据中绑定model模型的值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="entity"></param>
    /// <returns></returns>
    public static T ModelBing<T>(T entity)
    {
        object obj = Activator.CreateInstance(typeof(T));
        Type type = entity.GetType();
        PropertyInfo[] proInfos = type.GetProperties();
        Dictionary<string, PropertyInfo> dic = new System.Collections.Generic.Dictionary<string, PropertyInfo>();
        ; i < proInfos.Length; i++)
        {
            dic.Add(proInfos[i].Name, proInfos[i]);
        }
        HttpContext context = HttpContext.Current;
        var form = context.Request.Form;
        string[] keys = form.AllKeys;

        foreach (string key in keys)
        {

            if (dic.ContainsKey(key))
            {
                PropertyInfo pInfo = dic[key];
                var proType = pInfo.PropertyType;
                object value = null;//存储转换对应类型后的值

                if (string.IsNullOrEmpty(form[key]))//当post过来的值没有的时候
                {
                    if (proType == typeof(string))  //判断该属性是否string类型给空字符串,因为我数据库该字段不允许为null
                    {                                 //这里我不对值类型的数据进行判断了,因为值类型会有默认值
                        pInfo.SetValue(obj, "", null);
                    }
                    continue;
                }
                try
                {
                    if (proType.IsEnum)//如果属性是枚举类型,转换枚举类型
                    {
                        value = Enum.ToObject(proType, form[key]);

                    }
                    else if (proType.IsGenericType && proType.Name.StartsWith("Nullable"))//泛型类型
                    {
                        Type newproType = Nullable.GetUnderlyingType(proType);

                        value = Convert.ChangeType(form[key], newproType);
                    }
                    else
                    {
                        value = Convert.ChangeType(form[key], proType);
                    }

                    pInfo.SetValue(obj, value, null);
                }
                catch (Exception ex)
                {

                    throw ex;//写入错误日志
                }

            }
        }
        return (T)obj;
    }
}

前台可以通过EasyUI框架进行验证表单再提交到后台,这里就不再多说了,大家明白如何使用这个方法就好,有不完善的地方希望大家指出!

.net的WebForm模拟MVC进行模型绑定,让自己少操劳的更多相关文章

  1. ASP.NET MVC数组模型绑定

    在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type="text" name ...

  2. MVC数组模型绑定

    ASP.NET MVC数组模型绑定   在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type=& ...

  3. asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值

    asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...

  4. MVC之模型绑定

    1.前言 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方 ...

  5. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  6. MVC复杂模型绑定

    当初遇到业务需求ajax提交一组对象数组到服务器.但是苦于mvc的默认绑定器.绑定不上去.好吧只有靠自己了. 当初就是参考这个大大的博客:http://www.cnblogs.com/xfrog/ar ...

  7. 白话学习MVC(六)模型绑定

    一.什么是模型绑定? 模型绑定存在的意义就是为Action的参数提供值,例如:如下表单中提交了数据,那么Action(即:Index)的参数Id,Name的值就是表单中对应的name属性相同的值,而表 ...

  8. asp.net mvc 自定义模型绑定

    在asp.net mvc的控制器中如果能够活用模型的自动绑定功能的话能够减少许多工作量.但是如果我们想要对前台传来的数据进行一些处理再绑定到模型上,该怎么做呢? 这里用一个绑定用户数据的小案例来讲解a ...

  9. [MVC]自定义模型绑定器,从表单对模型进行赋值

    一.奇葩的问题 之前自己造轮子的时候,遇到一个很奇怪的问题,虽然需求很奇葩,但是还是尝试解决了一下 当提交的表单里包含多个重复名称的字段的时候,例如 <form action="/Te ...

随机推荐

  1. ListView自定义滑动条

    /** * 修改默认滑动条 */ private void SetSliderIcon() { try { Field f = AbsListView.class.getDeclaredField(& ...

  2. Sql 2012 OFFSET / FETCH NEXT BUG

    上个星期,测试发现了一个分页的bug--- 无论怎么分页数据的一样.我们所有的分页都是用EF 分页,为什么只有一个模块的分页有问题呢? 后来跟了下sql语句,发现用到是sql2012的新分页方式 OF ...

  3. 使用UIPageControl UIScrollView制作APP引导界面

    1. 新建两个视图控制器类(继承自UIViewController), 在AppDelegate.m中指定根视图控制器 #import "AppDelegate.h" #impor ...

  4. (转)OS X 升級後 MacPorts 重新安裝筆記

    原地址:http://blog.lyhdev.com/2012/07/os-x-macports.html Mac OS X 10.8 Mountain Lion 正式發佈,而且祭出台幣 $590 元 ...

  5. mysql 5.7.9(GA) 安装

    mysql 5.7.9(GA) 终于发布了,感受一下. 一.下载 下载页面 http://dev.mysql.com/downloads/mysql/ 选择相应系统的版本下载. 本文OS为centos ...

  6. 让Mac OS X中的PHP支持GD

    GD库已经是近乎于是现在主流PHP程序的标配了,所以也必须让Mac OS X中的PHP支持GD.在网上搜索了好多,最终按照这个方式成功实现,如何让Mac OS X支持PHP,请查看<让PHP跑在 ...

  7. .net转php laraval框架学习系列(三)项目实战---Route&Controllers

    本章来学习laravel的路由 一个简单的路由列子 Route::get('/', function() { return 'Hello World'; }); 路由的写法和Node的风格很相似.上面 ...

  8. 兼容IE与firefox、chrome的css 线性渐变(linear-gradient)

    现行渐变首先看下示例(1)垂直渐变 (2)垂直渐变 IE系列 filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr='#FF ...

  9. IOS 播放音频流媒体

    #pragma mark - 加载播放数据 - (void)loadData:(NSString *)musicUrl { NSURL *playURL = [NSURL URLWithString: ...

  10. Lintcode--004(最小子串覆盖)

    给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 注意事项 如果在source中没有这样的子串,返回"",如果有多个 ...