jQuery的ajax方法传递json数据到Handler.ashx?
jQuery的ajax方法把一段json参数值传到Handler.ashx里,在handler.ashx里怎么接收呢?
function get_org(id) {
var url = "/Handler/AjaxHandler.ashx";
var post_data = { id: id };//就是把这段传到handler.ashx里怎么接收?
$.ajax({
url: url,
type: "POST",
dataType: "json",
data: { action: "CallAjax", asm:"Framework.Web",className:"AjaxDemo", form: [post_data] },//我在这里通过form这个参数传递过去的,但是在接收的时候是个null
success: function (data) {
if (data != null && data != "") {
alert(data);
}
},
error: function (XMLHttpRequest, textStatus) {
alert("异常:" + XMLHttpRequest.reponseText + ";Status:" + textStatus);
}
});
}
我后端的handler.ashx代码
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string message = string.Empty;
string action = context.Request.Form["method"];
string assemblyName = context.Request.Form["asm"];
string className = context.Request.Form["className"];
string param = context.Request.Form["form"];
if (string.IsNullOrEmpty(action))
{
message = "调用方法不能为空!";
}
if (string.IsNullOrEmpty(assemblyName))
{
message += "调用方法的程序集不能为空!";
}
if (string.IsNullOrEmpty(className))
{
message += "调用方法的类名不能为空!";
}
object p = JsonConvert.DeserializeObject(param); //我想在这里把传过来的json转换成一个对象
try
{
Assembly assembly = Assembly.Load(assemblyName);
Type type = assembly.GetType(assemblyName + "." + className);
object o = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod(action);
method.Invoke(o, new object[] { JsonConvert.DeserializeObject(param) });//由于前面的param获取有问题,所以这里的反射调用方法时,没办法传递方法参数
}
catch (Exception ex)
{
throw ex;
}
}
[解决办法]
.ashx文件下把context.Response.ContentType = "text/plain"; 这个改成context.Response.ContentType = "application/json";试试
[解决办法]
哎呀 看了LZ的参数 你怎么程序集和类名都给包含了呢。。的却是挺不安全的
我有一篇文章是写ajax访问ashx反射执行方法的,可以看下
在ashx中利用反射+jquery轻松处理ajax 含Demo源码
[解决办法]
lz他可以判断反序列出来的 p 是否实现了某个接口,甚至调用这个接口里的内容来进行权限判断。而lz自己的代码并不需要修改一行,仅需要扩展一行就行了。
[解决办法]
例如你可以为Command定义一个通用的结构,例如json
{
passportId: 223323,
commandName: "ABC.PaychecksToEmployee",
commandData: {
UserName: "张三",
Year: 2013,
Month: 2
},
}
这样,服务器端可以根据commandName到所有命令类型中查找到相应的命令,然后将commandData反射为这个命令对象,执行这个命令,再将结果通过context输出给客户端。