基于.NET中:自动将请求参数绑定到ASPX.ASHX和MVC的方法(菜鸟必看)

2014-01-17  来源:本站原创  分类:实用技巧  人气:19 

这篇文章的目的就是告诉初学者如何自动将客户端用AJAX发送的参数自动绑定为强类型的成员属性或方法参数

前言

刚开始做AJAX应用的时候,经常要手工解析客户端传递的参数,这个过程极其无聊,而且代码中充斥着:Request["xxx"]之类的代码。

这篇文章的目的就是告诉初学者如何自动将客户端用AJAX发送的参数自动绑定为强类型的成员属性或方法参数。

自动绑定到ASPX和ASHX

框架支持

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 namespace Happy.Web
 {
     public interface IWantAutoBindProperty
     {
     }
 }

复制代码 代码如下:

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 namespace Happy.Web
 {
     [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
     public sealed class AutoBind : Attribute
     {
     }
 }

复制代码 代码如下:

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 using System.Web;

 using Newtonsoft.Json;

 using Happy.ExtensionMethods.Reflection;

 namespace Happy.Web
 {
     public class JsonBinderModule : IHttpModule
     {
         public void Init(HttpApplication context)
         {
             context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
         }

         private void OnPreRequestHandlerExecute(object sender, EventArgs e)
         {
             if (!(HttpContext.Current.CurrentHandler is IWantAutoBindProperty))
             {
                 return;
             }

             var properties = HttpContext.Current.CurrentHandler.GetType().GetProperties();

             foreach (var property in properties)
             {
                 if (!property.IsDefined(typeof(AutoBind), true))
                 {
                     continue;
                 }

                 string json = HttpContext.Current.Request[property.Name];

                 var value = JsonConvert.DeserializeObject(json, property.PropertyType);

                 property.SetValue(HttpContext.Current.Handler, value);
             }
         }

         public void Dispose()
         {
         }
     }
 }

代码示例

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>

 <configuration>

     <system.web>
       <compilation debug="false" targetFramework="4.0" />
       <httpModules>
         <add name="JsonBinderModule" type="Happy.Web.JsonBinderModule"/>
       </httpModules>
     </system.web>

 </configuration>

复制代码 代码如下:

/// <reference path="../ext-all-debug-w-comments.js" />
 var data = {
     Name: '段光伟',
     Age: 28
 };

 Ext.Ajax.request({
     url: '../handlers/JsonBinderTest.ashx',
     method: 'POST',
     params: { user: Ext.encode(data) }
 });

复制代码 代码如下:

<%@ WebHandler Language="C#" Class="JsonBinderTest" %>

 using System;
 using System.Web;

 using Happy.Web;

 public class JsonBinderTest : IHttpHandler, IWantAutoBindProperty
 {
     [AutoBind]
     public User user { get; set; }

     public void ProcessRequest(HttpContext context)
     {
         context.Response.ContentType = "text/plain";
         context.Response.Write(string.Format("姓名:{0},年龄:{1}", user.Name, user.Age));
     }

     public bool IsReusable
     {
         get
         {
             return false;
         }
     }
 }

 public class User
 {
     public string Name { get; set; }

     public int Age { get; set; }
 }

运行结果

基于.NET中:自动将请求参数绑定到ASPX.ASHX和MVC的方法(菜鸟必看)

自动绑定到MVC
框架支持

复制代码 代码如下:

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 using System.Web.Mvc;

 using Newtonsoft.Json;

 namespace Tenoner.Web.Mvc
 {
     public class JsonBinder : IModelBinder
     {
         public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
         {
             string json = controllerContext.HttpContext.Request[bindingContext.ModelName];

             return JsonConvert.DeserializeObject(json, bindingContext.ModelType);
         }
     }
 }
相关文章
  • 基于.NET中:自动将请求参数绑定到ASPX.ASHX和MVC的方法(菜鸟必看) 2014-01-17

    这篇文章的目的就是告诉初学者如何自动将客户端用AJAX发送的参数自动绑定为强类型的成员属性或方法参数 前言 刚开始做AJAX应用的时候,经常要手工解析客户端传递的参数,这个过程极其无聊,而且代码中充斥着:Request["xxx"]之类的代码. 这篇文章的目的就是告诉初学者如何自动将客户端用AJAX发送的参数自动绑定为强类型的成员属性或方法参数. 自动绑定到ASPX和ASHX 框架支持 using System; using System.Collections.Generic; us

  • SQL中函数 replace 的参数1的数据类型ntext无效的解决方法 2014-10-11

    SQL中函数 replace 的参数 1 的数据类型 ntext 无效.找了半天找到了解决办法 今天将一个ACC的数据库转换成ms-sql以后发现在使用replace替换语句的时候出现: SQL中函数 replace 的参数 1 的数据类型 ntext 无效.找了半天找到了解决办法: 因为ntext需要转化下 用如下语句即可解决: UPDATE 表 SET 字段=REPLACE(cast(字段 AS varchar(8000)),'被替换的内容','将要替换成的内容') varchar(8000

  • 扩展SpringMVC以支持绑定JSON格式的请求参数 2014-02-18

    上一篇:<扩展SpringMVC以支持更精准的数据绑定> 此方案是把请求参数(JSON字符串)绑定到java对象,,@RequestBody是绑定内容体到java对象的. 问题描述: 你好,对于如下的json数据,springmvc的数据绑定该如何做? accessionDate 2012-11-21 deptIds [{"deptId":4,"isPrimary":true}] email [email protected] fax 3423432 gende

  • 基于Android中的 AutoCompleteTextView实现自动填充 2014-10-06

    本篇文章小编为大家介绍,基于Android中的 AutoCompleteTextView实现自动填充.需要的朋友参考下 现在我们上网会用百度或者谷歌搜索信息,当我们在输入框里输入一两个字后,就会自动提示我们想要的信息,这种效果在Android 是通过Android 的AutoCompleteTextView Widget 搭配ArrayAdapter 设计同类似Google 搜索提示的效果. 先在Layout 当中布局一个AutoCompleteTextView Widget ,然后通过预先设置

  • 提高生产力:SpringMVC中,使用扩展数据类型TypedMap接收Web请求参数 2015-04-13

    在Web项目中,如果前端MVC框架使用的是SpringMVC,可以使用Map接收前端请求参数,比bean要方便很多. 尤其是SpringMVC和Mybatis一起用的时候,用Map大大减少了需要的bean/vo/po之类的东东. 用Map也会遇到一个问题,就是类型转换的代码特别的多. /** * 得到当前页面的页数 */ private int getCurrentPage(Map<String, Object> params){ return Integer.parseInt(params.

  • ThinkPHP3.1新特性之Action参数绑定 2014-04-25

    ThinkPHP3.1版的Action参数绑定功能提供了URL变量和操作方法的参数绑定支持,这一功能可以使得你的操作方法定义和参数获取更加清晰,也便于跨模块调用操作方法,需要的朋友可以参考下 ThinkPHP3.1版的Action参数绑定功能提供了URL变量和操作方法的参数绑定支持,这一功能可以使得你的操作方法定义和参数获取更加清晰,也便于跨模块调用操作方法.这一新特性对以往的操作方法使用没有任何影响,你也可以用新的方式来改造以往的操作方法定义. Action参数绑定的原理是把URL中的参数(不

  • 基于Jenkins的自动构建系统开发 2014-07-24

     1 绪论 1.1 课题的研究背景 随着IT行业的不断发展,软件开发的复杂度也随着不断提高.与此同时,软件的开发团队也越来越庞大,而如何更好地协同整个团队进行高效准确的工作,从而确保软件开发的质量已经慢慢成为了开发过程中不可回避的问题. 在软件开发中,不同的功能模块一般由不同的开发成员负责,同一功能模块的各层代码也可能是不同的开发成员编写,经验告诉我们,模块之间的问题是最难解决的,也是最耗费时间的.它需要多个开发人员相互协作找出问题,而协作过程中的沟通所消耗的时间成本是相当高的.而且还可能因

  • 基于.NET中建构子中传递子对象的对象详解 2013-10-13

    本篇文章介绍了,基于.NET中建构子中传递子对象的对象详解.需要的朋友参考下 在设计对象继承的时候,父对象建构子会需要一些参数,这些参数可以由子对象建构子透过base关键词来提供. namespace Test001 { public class ParentClass { // Constructors public ParentClass(IEnumerable<string> dataCollection) { this.DataCollection = dataCollection;

  • 基于jquery中children()与find()的区别介绍 2014-04-21

    本篇文章介绍了,基于jquery中children()与find()的区别,需要的朋友参考下 .children(selector) 方法是返回匹配元素集合中每个元素的所有子元素(仅儿子辈).参数可选,添加参数表示通过选择器进行过滤,对元素进行筛选. .find(selector)方法是返回匹配元素集合中每个元素的后代.参数是必选的,可以为选择器.jquery对象可元素来对元素进行筛选. .find() 与 .children() 方法类似,不同的是后者仅沿着 DOM 树向下遍历单一层级.这里的

  • Android中发送Http请求(包括文件上传.servlet接收)的实例代码 2014-07-27

    首先我是写了个java工程测试发送post请求:可以包含文本参数和文件参数 /** * 通过http协议提交数据到服务端,实现表单提交功能,包括上传文件 * @param actionUrl 上传路径 * @param params 请求参数 key为参数名,value为参数值 * @param file 上传文件 */ public static void postMultiParams(String actionUrl, Map<String, String> params, FormBe

  • Android中给fragment写入参数的轻量开发包FragmentArgs简介 2014-09-09

    这篇文章主要介绍了Android中给fragment写入参数的轻量开发包FragmentArgs简介,需要的朋友可以参考下 Android开发有时候会令人头痛.你不得不为诸如建立fragment这样简单的事情写很多代码.幸运的是java支持一个强大的工具:注释处理器(Annotation Processors). Fragment的问题是你不得不设置很多参数,从而让它正常运行.很多android开发新手通常这样写: public class MyFragment extends Fragment

  • 如何让thinkphp在模型中自动完成session赋值小教程 2014-11-10

    在项目中遇到一个问题,需要让thinkphp在模型中自动完成session赋值,经过一番研究,终于实现,下面记录一下,另附上thinkPHP的session的相关知识 相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比如自动验证.自动完成等,今天在开发中遇到自动完成中需要获取session值 然后自动赋值的功能,具体看代码: class ArticlelModel extends Model { protected $_auto = array ( array('

  • Eclipse中自动重构实现探索 2015-03-28

    本文用eclipse的自动重构功能对一个程序实例进行重构,目的是探索Eclipse自动重构可以在多大程度上辅助重构这个过程.程序实例使用<Refactoring:Improving the Design of Existing Code>一书中的例子. Eclipse的自动重构功能能够很好地支持各种程序元素的重命名,并自动更新相关的引用.Eclipse能够支持方法.字段在类之间移动,并自动更新引用.Eclipse较好地支持内联字段.函数的更新替换.Eclipse较好地支持抽取方法.变量等程序元

  • 基于C#中IDisposable与IEnumerable.IEnumerator的应用 2015-04-07

    本篇文章小编为大家介绍,基于C#中IDisposable与IEnumerable.IEnumerator的应用,需要的朋友参考下 C#中如何合理的释放非托管内存?在本文中我们将讲解使用IDisposable释放托管内存和非托管内存. A.首先需要让类实现IDisposable接口,然后实现IDispose方法. A.a核心Disponse(bool isDisponse) 1.此方法首先判断isReadyDisposed(判断是否第一次调用此核心方法),如果不是第一次调用则不做任何操作. 2.再

  • 基于ubuntu中使用mysql实现opensips用户认证的解决方法 2015-04-21

    本篇文章小编为大家介绍,基于ubuntu中使用mysql实现opensips用户认证的解决方法.需要的朋友参考下 1 MySQL支持 1.1 MySQL模块支持 默认安装时,不包含MySQL模块. opensipsctlrc文件中包含了数据库配置的信息,要想让opensips支持mysql数据库,在编译安装的时候 就要支持mysql模块.方法如下: (1)修改opensips中的Makefile.conf,在exclude_modules中去掉db_mysql,在include_modules中

  • SQL Server 2008中的表值型参数 2014-06-27

    表值型参数(Table-valued parameters)是SQL Server 2008中引入的一种新特性,它提供了一种内置的方式,让客户端应用可以只通过单独的一条参化数SQL语句,就可以向SQL Server发送多行数据. 这一功能的基础是SQL Server 2008中最新的用户自定义表类型(User-Defined Table Types),它允许用户将表的定义注册为全局周知类型.注册之后,这些表类型可以像本地变量一样用于批处理中.以及存储过程的函数体中,很像早期SQL Server版

  • 文本框中自动完成的应用 2015-03-09

    近来积累了一些关于自动完成的应用方式,今天将其扩展延伸并整理了些常见的应用方法供大家一起学习. "自动完成"的设计思路源自于Poka-yoka预防机制.是一种自动纠偏方法,在生产中用以防止人为失误发展成为最终产品缺陷. 网页设计中自动完在输入框的应用已很广泛,属于反应性界面的强大模式.能够尝试猜测用户输入的文字,并且动态的搜索出适配的结果并推荐给用户,辅助完成输入.目的是避免用户打错字,起到提示作用,智能预测用户心理期望,从而确保他们的搜索更有效率. 优点: "自动完成&qu

  • 使用IIS 7自动将请求转发至内容服务器上 2015-05-01

    微软为IIS 7发布了一个新的路由转发模块(routing module).这个模块能根据各种情况自动将请求转发(routes)至内容服务器,例如HTTP头.服务器端变量或者服务器健康程度等负载均衡所考虑的状况.管理员能够在六种负载均衡算法中选择其一,并且调整检查特定服务器健康状况的条件.如果客户端能接受cookie,或者通过主机名,就能在客户端级别上建立与内容服务器的紧密关系. 与此同时,微软以IIS管理器扩展的方式发布了管理与监测工具(Management and Monitoring to

  • 关于 HTTP GET/POST 请求参数长度最大值的一个理解误区 2013-06-09

    刚看到群里又有同学在说 HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过 XX,而 Post 是无限制的,看到这里,我想他们定是看多了一些以讹传讹的博客或者书籍, 导致一种理解上的误区: 1.首先即使有长度限制,也是限制的是整个 URI 长度,而不仅仅是你的参数值数据长度. 2.HTTP 协议从未规定 GET/POST 的请求长度限制是多少. The HTTP protocol does not place any a priori limit on the length o

  • 实例讲解遗传算法--基于遗传算法的自动组卷系统[理论篇] 2014-12-17

    一.遗传算法介绍 1.1 遗传算法概要 遗传算法(Genetic Algorithm,简称GA)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法,由美国的J.Holland教授1975年首先提出.遗传算法是一种模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,通过模拟自然进化过程搜索最优解,它常用来解决多约束条件下的最优问题. 遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成.每个个体实际上是染色体带有特征的