将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控制表达式将给我一些好的建议。
根据如何通过回调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格式的字符串,然后作为控制器端反序列化器可识别的普通字符串传递给响应。这种方法实现了客户端对象应该传递给的方式:
- 自定义对象应该被序列化为字符串;
- 此字符串将在服务器端使用
Request.Params
集合获得。如果对字符串进行反序列化,就会得到可以在服务器端创建自定义对象。
因此,我得出结论,您可以通过两种方式传递原始JSON对象:
通过直接使用
customArgs
,您可以声明Dictionary
作为输入参数,并使用数值类型或String
传递值。避免使用Object
类型,它似乎创建字符串数组作为值部分。通过使用
Request.Params
将JSON对象转换为编码字符串并传递给customArgs
,然后使用反序列化来显示键和值。
注意:不是使用包含Dictionary的struct作为单个输入参数,你可以用不同数量的输入参数编写几个GridViewPartial
方法重载来处理网格部分视图。
欢迎提出任何建议或勘误。
额外的参考:
如何将复杂对象作为回调参数传递给回调Action