2016-09-20 26 views
2

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

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); 
    } 

这样我得到空的参数数量。但对象是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

根据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>,看来我还是能够捕捉到

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 
    } 
} 

结果::

由此代码键和值在JSON对象
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 plugin其将通过editorsNames给予JSON格式的字符串对象,然后传递到响应为纯可由控制器端的解串器识别的字符串。这种方法满足客户端的对象应该如何被传递到:

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

因此,我的结论是,可以通过2种方式传递原始JSON对象:

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

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

NB:代替使用一个结构的包含字典作为单一输入参数,可以写几个GridViewPartial与不同量的输入参数来处理网格局部视图方法重载。

任何建议或erratas欢迎。

附加参考:

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

+0

我没有尝试在所有)阅读你的答案后,我决定做<字符串,字符串>,让我送,我想要的任何数据和上将其转换成我需要的数据。 现在我在字典中获取我的json,其中key = objname amd value = serialized string) – DespeiL

+0

Thx,为您的详细问题分析和建议 – DespeiL