Devexpress MVC对象作为回调参数

时间:2016-09-20 18:51:13

标签: c# asp.net-mvc devexpress

我尝试为所有网格视图控制器创建一个抽象类。由于所有控制器都具有相同的GridViewPartial Action但具有不同的参数,因此我决定使用Args属性创建struct ActionParams以保留所有输入参数。 所以这是我的结构:

   public struct ActionParams
        {
            public Dictionary<string, object> Args { get; set; }

        }

控制器动作

public ActionResult GridViewPartial(ActionParams input) {  }

问题出在JS onBeginCallback函数中。我尝试以两种方式执行此任务:

1)

 function onBeginCallback(s, e)
 {
                     e.customArgs["Args"]={"value1":1,"value2":2};
 }

我没有获取字符串键和int值,而是获得了字符串键和字符串[]值。据我所知,这是序列化问题。

2)

 function onBeginCallback(s, e)
    {
        var editorsNames = {"value1":1 ),"value2":2}
        e.customArgs["Args"] = $.toJSON(editorsNames);
    }

通过这种方式我得到了空的Args。但是对象在Request.Params中,所以我得到了以下方式:

 public ActionResult GridViewPartial(ActionParams input)
        {

            string jsonText = Request.Params["Args"];
            if (string.IsNullOrEmpty(jsonText))
            { }
            else
            {
                ActionParams data = new ActionParams>();
                try
                {
                    data.Args = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Dictionary<string,int>>(jsonText);
                }
                catch
                {
                    ViewData["ErrorMessage"] = "Incorrect data";
                }
            }

        }

现在我想知道是否有可能将这个JSON对象直接发送到input.Args就像是在案例1中?(对于简单的jquery ajax一切正常)。

希望有一个很好的devexpress MVC控制表达式的人会给我一些很好的建议。

1 个答案:

答案 0 :(得分:1)

根据How to pass complex types to the server with a callback customArgs argument

  

创建对象并将其传递给e.customArgs参数时,   我们的代码不会将对象序列化为字符串,因此您可以这样做   没有正确获取服务器端的客户端对象。

首先要了解如何使用console.log(e.customArgs)将原始JSON对象传递给控制器​​,以在控制台中显示此对象结构:

Object { Args: Object {"value1": 1, "value2": 2}}

当输入Args参数指定为Dictionary<String, int>时,似乎我能够通过此代码捕获JSON对象中的键和值:

public ActionResult GridViewPartial(Dictionary<String, int> Args)
{
    // Args parameter contains 2 arrays with Count = 2
    // Args.Keys contains "value1" and "value2"
    // Args.Values contains 1 and 2
    foreach (String key in Args.Keys)
    {
        // do something to pass keys
    }

    foreach (int value in Args.Values)
    {
        // do something to pass values
    }
}

结果:

Variable: Args
Count: 2
Content:
0x0000 {["value1", 1]}
0x0001 {["value2", 2]}

但是,当我将值部分更改为Dictionary<String, Object>时,我发现问题与此相同:Value部分更改为System.String[]数组,其中包含数字1或2作为字符串。

Variable: Args
Count: 2
Content:
0x0000 {["value1", System.String[]]} => Value: String[1] => 0x0000 = "1"
0x0001 {["value2", System.String[]]} => Value: String[1] => 0x0000 = "2"

尝试将输入变量类型更改为Dictionary<String, String>会返回:

Variable: Args
Count: 2
Content:
0x0000 {["value1", "1"]}
0x0001 {["value2", "2"]}

第二种情况使用jQuery JSON plugineditorsNames给出的对象转换为JSON格式的字符串,然后作为普通字符串传递给响应,该字符串可由控制器端的反序列化程序识别。这种方法实现了客户端对象的传递方式:

  
      
  1. 自定义对象应序列化为字符串;
  2.   
  3. 将使用Request.Params集合在服务器端获取此字符串。如果你反序列化字符串,你将是   能够在服务器端创建自定义对象。
  4.   

因此,我得出结论,您可以通过两种方式传递原始JSON对象:

  1. 直接使用customArgs,您可以声明Dictionary作为输入参数,并使用数值类型或String传递值。避免使用似乎创建字符串数组的Object类型作为值部分。

  2. 使用Request.Params,将JSON对象转换为编码字符串并将其传递给customArgs,然后使用反序列化来显示键和值。

  3. 注意:您可以使用不同数量的输入参数编写多个GridViewPartial方法重载来处理网格局部视图,而不是使用包含Dictionary作为单个输入参数的结构。

    欢迎任何建议或错误。

    补充参考:

    How to pass complex objects to a callback Action as callback arguments