基于.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; }
}
运行结果
自动绑定到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);
}
}
}