Ext.Net使用DirectMethod.request调用一般处理程序(.ashx)并传递参数

前段时间使用Ext.Net实现在CodeBehind中动态生成表单项到FormPanel中,并实现表单项的保存,在做的过程中发现几点问题:

①、在后台给Button添加DirectClick事件时,虽然能添加成功,但是点击按钮执行时就会报500的错误。

于是改为在前台JS中去获取数据,然后使用DirectMethod.request方法去调用一般处理程序去实现数据的保存,代码如下:

 1 function save(strIDControl) {
 2     var data = eval(strIDControl);
 3     if (data.length > 0) {
 4         var saveFlag = true;
 5         var retValue = new Array();
 6         for (i = 0; i < data.length; i++) {
 7             var control = Ext.getCmp(data[i].ControlID);
 8             var value = control.getValue();
 9             var parentControl = control.ownerCt;
10             if (control.allowBlank == false && (value == null || value == "")) {
11                 control.focus();
12                 parentControl.focus();
13                 saveFlag = false;
14                 return;
15             }
16             var obj = new Object();
17             obj.ID = data[i].ID;
18             obj.Value = value;
19             retValue[i] = obj;
20         }
21         if (saveFlag == true) {
22             Ext.net.DirectMethod.request({
23                 url: "SaveService.ashx",
24                 method:"post",
25                 clearRequest: true,
26                 params: {
27                     submit:retValue
28                 },
29                 success: function (result) {
30                     alert(result);
31                 }
32             });
33         }
34     }
View Code

 ②、JS中通过Params把参数传递到一般处理程序中,通过context.Request.Params["submit"]发现获取不到传递的数据

后来查看context中的数据,发现我们传递的数据在Request.Params["submitDirectEventConfig]中,格式为JSON字符串,如图所示:

③、如何从上面的JSON字符串里面获取我们需要的数据,具体代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using Ext.Net;
namespace TestFunctions
{
    /// <summary>
    /// SaveService 的摘要说明
    /// </summary>
    public class SaveService : IHttpHandler
    {
        public struct Params
        {
            public int ID
            {
                get;
                set;
            }
            public string Value
            {
                get;
                set;
            }
        }
        public struct ExtraParamsConfig
        {
            public object Submit
            {
                get;
                set;
            }
        }
        public struct Config
        {
            public string __EVENTTARGET
            {
                get;
                set;
            }
            public string __EVENTARGUMENT
            {
                get;
                set;
            }
            public object extraParams
            {
                get;
                set;
            }
        }
        public struct DirectEventConfig
        {
            public Config Config
            {
                get;
                set;
            }
        }
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            string directEventConfig = context.Request.Params["submitDirectEventConfig"];
            DirectEventConfig EventConfig= JSON.Deserialize<DirectEventConfig>(directEventConfig);
            object obj = EventConfig.Config.extraParams;
            string str = obj.ToString();
            ExtraParamsConfig extra = JSON.Deserialize<ExtraParamsConfig>(str);
            object submit = extra.Submit;
            List<Params> list = JSON.Deserialize<List<Params>>(submit.ToString());
            context.Response.Write(JSON.Serialize("hello the world"));
        }

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

这里是通过多次反序列化实现的,最终list里面得到的就是我们需要的数据。

原文地址:https://www.cnblogs.com/hongyan5682/p/4580428.html