一、前言

用过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. 移动端(IOS)iframe监听不到 onscroll 事件

    问题描述: 我在一个页面A中有瀑布流,点击瀑布流中的图片需要进入到另外一个页面B,点击返回需要回到页面A中点击的位置,为了实现该效果所以在页面A中嵌入iframe,iframe指向页面B,页面B中同样 ...

  2. (转)Newtonsoft.Json序列化和反序列

    这里下载:http://www.newtonsoft.com/products/json/安装:   1.解压下载文件,得到Newtonsoft.Json.dll   2.在项目中添加引用.. 序列化 ...

  3. IE9的window.showmodaldialog显示问题

    <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat=&quo ...

  4. Android 命令

    连接调试 adb connect 127.0.0.1:6555

  5. C++ 基本数据结构整理

    Hash Map (Unordered_map) Insert #include <unordered_map> using namespace std; unordered_map &l ...

  6. Java系列--第七篇 基于Maven的Android开发实战项目

    本篇是基于<Android应用案例开发大全,吴亚峰等著>的项目开发实例源码,其中有些图片,我做了一些修改,用于个人学习,请勿用于商业. 1, 日程管理专家 mvn archetype:ge ...

  7. POJ1840 hash

    POJ1840 问题重述: 给定系数a1,a2, ..,a5,求满足a1 * x1 ^ 3 + a2 * x2 ^ 3 +... + a5 * x5 ^ 3 = 0的 xi 的组数.其中ai, xi都 ...

  8. Python入门-----介绍

    摘要:Python语言的特点 ----->优雅.明确.简单 一.Python适合的领域 web网站和各种网络服务 系统工具和脚本 作为“胶水”语言,把其他语言开发的模块包装起来方便使用 二.Py ...

  9. VC2013 添加库文件

    1.项目--〉属性--〉链接器 1. You #include the header file (.h) file in your project as necessary.   2. You lis ...

  10. EasyUI datagrid简单运用

    jquery的前端框架挺多的,有easyUI ,bootstrap...,对于做系统软件或许easyUI比较好,因为里面控件很丰富,而bootstrap非常简洁大方,但是控件相 对比较少,特别是复杂的 ...