欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-01 18:15:28
前言 刚开始做ajax应用的时候,经常要手工解析客户端传递的参数,这个过程极其无聊,而且代码中充斥着:request["xxx"]之类的代码。 这篇文章的目的就是告诉初...

前言

刚开始做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);
         }
     }
 }