gpt4 book ai didi

c# - Devexpress MVC 对象作为回调参数

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:20 24 4
gpt4 key购买 nike

我尝试为我所有的 GridView Controller 创建一些抽象类。由于所有 Controller 都将具有相同的 GridViewPartial Action 但具有不同的参数,因此我决定创建具有 Args 属性的结构 ActionParams 以将所有输入参数保留在那里。所以这是我的结构:

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

}

和 Controller Action

public ActionResult GridViewPartial(ActionParams input) {  }

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

1)

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

我得到的不是字符串键和整数值,而是字符串键和字符串[]值。据我了解,这是序列化问题。

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控件表达式的人给我一些好的建议。

最佳答案

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

When you create an object and pass it to the e.customArgs argument, our code does not serialize the object to a string, and thus you do not get the client-side object on the server side correctly.

揭示原始 JSON 对象如何通过使用 console.log(e.customArgs) 传递给 Controller ​​的第一次尝试在控制台中显示此对象结构:

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 plugin转换 editorsNames 给定的对象到 JSON 格式的字符串,然后作为普通字符串传递给响应, Controller 端的反序列化器可以识别该字符串。这种方法实现了如何将客户端对象传递给:

  1. A custom object should be serialized to a string;
  2. This string will be obtained on the server side using the Request.Params collection. If you deserialize the string, you will be able to create your custom object on the server side.

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

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

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

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

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

附加引用:

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

关于c# - Devexpress MVC 对象作为回调参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39601701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com