将MVC对象作为回调参数

本文关键字:回调 参数 MVC 对象 | 更新日期: 2023-09-27 18:08:02

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

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

不是得到string key和int value,而是得到string key和string[] value。据我所知,这是序列化问题。

2)

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

这样我得到了空Args。但是object在Request中。参数,所以我得到如下方式:

 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对象直接发送到输入。像案例1那样的Args ?(对于简单的jquery ajax一切正常)。

希望有人与伟大的devexpress MVC控制表达式将给我一些好的建议。

将MVC对象作为回调参数

根据如何通过回调customArgs参数将复杂类型传递给服务器:

当你创建一个对象并将其传递给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插件,它将editorsNames给出的对象转换为JSON格式的字符串,然后作为控制器端反序列化器可识别的普通字符串传递给响应。这种方法实现了客户端对象应该传递给的方式:

  1. 自定义对象应该被序列化为字符串;
  2. 此字符串将在服务器端使用Request.Params集合获得。如果对字符串进行反序列化,就会得到可以在服务器端创建自定义对象。

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

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

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

注意:不是使用包含Dictionary的struct作为单个输入参数,你可以用不同数量的输入参数编写几个GridViewPartial方法重载来处理网格部分视图。

欢迎提出任何建议或勘误。

额外的参考:

如何将复杂对象作为回调参数传递给回调Action