我尝试为所有网格视图控制器创建一个抽象类。由于所有控制器都具有相同的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控制表达式的人会给我一些很好的建议。
答案 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 plugin将editorsNames
给出的对象转换为JSON格式的字符串,然后作为普通字符串传递给响应,该字符串可由控制器端的反序列化程序识别。这种方法实现了客户端对象的传递方式:
- 自定义对象应序列化为字符串;
- 将使用
醇>Request.Params
集合在服务器端获取此字符串。如果你反序列化字符串,你将是 能够在服务器端创建自定义对象。
因此,我得出结论,您可以通过两种方式传递原始JSON对象:
直接使用customArgs
,您可以声明Dictionary
作为输入参数,并使用数值类型或String
传递值。避免使用似乎创建字符串数组的Object
类型作为值部分。
使用Request.Params
,将JSON对象转换为编码字符串并将其传递给customArgs
,然后使用反序列化来显示键和值。
注意:您可以使用不同数量的输入参数编写多个GridViewPartial
方法重载来处理网格局部视图,而不是使用包含Dictionary作为单个输入参数的结构。
欢迎任何建议或错误。
补充参考:
How to pass complex objects to a callback Action as callback arguments