一、前言

用过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. (转)jQuery Validation Plugin客户端表单证验插件

    jQuery Validation Plugin客户端表单验证插件 官方文档:http://jqueryvalidation.org/documentation/ 官方demo:http://jque ...

  2. (转)ligerUI 使用教程之Tip介绍与使用

    概述:   ligertip是ligerUI系列插件中的tooltip类插件,作用是弹一个浮动层,起提示作用   阅读本文要求具备jQuery的基本知识,不然文中的javascript代码不易理解 截 ...

  3. winform 获取当前项目所在的路径

    代码: string curAppPath = System.IO.Directory.GetParent(System.Environment.CurrentDirectory).Parent.Fu ...

  4. ImportError No module named memcache

    ImportError: No module named memcache 没有找到windows下的memcache,我们就用linux下的包来安装 先下载memcache linux下的安装包 f ...

  5. MySQL 数据库操作命令汇总

    此文全部都是基本的数据库语言 1.登陆到mysql >mysql -h hostname -u username -p 然后等待系统提示输入密码即可登陆.如果想在登陆的时候就选择好数据库,可以使 ...

  6. PHP数组的排序函数

    对保存在数组中的相关数据进行排序是一件非常有意义的事情.在PHP中提供了很多函数可以对数组进行排序,这些函数提供了多种排序的方法.例如,可以通过元素的值或键及自定义排序等. ①简单的数组排序函数简单的 ...

  7. IIS自定义404错误页显示“系统找不到指定的文件”解决方法

    在IIS站点属性里面设置了自定义的404错误页面为一个文件之后,有时一直不生效,总是提示这样一句话:“系统找不到指定的文件”. 其实这种错误也只是在某些网站程序中出现,其实解决办法很简单.这是由于II ...

  8. python 各模块

    01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支 ...

  9. 窗口过程 - Windows程序设计(SDK)006

    窗口过程 让编程改变世界 Change the world by program 内容节选: Windows 把这样一个窗口分为了客户区和非客户区,这里边白色的这一大片就是客户区,而这些标题栏.菜单栏 ...

  10. WebVR

    WebVR 主要面向Web前端工程师,需要一定Javascript及three.js基础:本文主要分享内容为基于three.js开发WebVR思路及碰到的问题:有兴趣的同学,欢迎跟帖讨论. 目录:一. ...