在c#控制器中读取JSON对象/数组
本文关键字:对象 数组 JSON 读取 控制器 | 更新日期: 2023-09-27 18:12:22
首先,我为任何错误的术语提前道歉!我读了很多关于如何做到这一点的博客和文章,我已经失明了,但却陷入了僵局。
我已经成功地通过AJAX将参数传递给控制器中的MVC操作,该操作以JSON格式返回SQL数据表供我在页面中使用。我发送的一组参数示例如下:
var parameters = {
pSQL: "SELECT * FROM v_MyTable",
pSQLServer: "SERVER01",
};
我的客户端脚本是这样的;
$.ajax({
type: 'POST',
url: '/ControllerName/GiveMeJSON',
data: JSON.stringify(parameters),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
...
});
我的控制器动作简单地像这样工作;
public string GiveMeJSON(string pSQL, string pSQLServer)
{
var SQL = pSQL
var SQLSERVER = pSQLServer
// do stuff and return JSON
}
这对我来说一直很有效。我发送JSON请求数据作为POST和接收JSON数据作为回报。辉煌。
现在,我想扩展我的动作的功能,这样我就可以传递一个额外的变量集作为一个数组,就像这样;
var parameters = {
pSQL: "SELECT * FROM v_MyTable",
pSQLServer: "SERVER01",
pMoreParams: {
pParameter1: "ABC",
pParameter2: "XYZ",
}
};
…其中MoreParams中的参数名可以被称为任何类型的值。这很重要,因为我认为这就排除了使用模型的可能性。
这导致POST请求的BODY看起来像这样:
{"pSQL":"SELECT * FROM v_MyTable","pSQLSERVER":"SERVER01","pMoreParams":{"pParameter1":"ABC","pParameter2":"XYZ"}}
所以我需要的数据显然是去服务器,但我真的很难枚举/访问这些额外的项目在pMoreParams数组。我似乎离目标越来越近了,我试过使用……
public string GiveMeJSON(string pSQL, string pSQLServer, List<string> pMoreParams)
…和我有一个foreach循环在控制器运行然而许多项目都在pMoreParams列表(2,在上面的例子中),但只是似乎无法弄清楚如何访问/读取这些值在该列表中的控制器动作。
我现在不知道如何循环并读取我发送的额外数据。我感觉我很接近,使用List<string>
或IEnumerable
-但解决方案回避了我。
当我将它们作为一个简单的有效JSON字符串发送时,我有更多的成功让控制器读取这些额外的参数,像这样;
var parameters = {
pSQL: "SELECT * FROM v_MyTable",
pSQLServer: "SERVER01",
pMoreParams: '[{"name": "pParameter1", "value": "ABC" },{"name": "pParameter2", "value": "XYZ"}]'
};
…使用控制器动作看起来像这样;
public class SQLParam
{
public string name { get; set; }
public string value { get; set; }
}
if (string.IsNullOrEmpty(pMoreParams) == false)
{
var sqlparameters = JsonConvert.DeserializeObject<SQLParam[]>(pMoreParams);
foreach (var sqlparameter in sqlparameters)
{
Debug.WriteLine(sqlparameter.name, sqlparameter.value);
}
};
…但是我失去了在客户端jquery/javascript中轻松读取和修改这些值的能力,我更喜欢/希望保持我定义参数的方式,这样我就可以使用一行代码轻松读取和修改值,比如;
parameters.pMoreParams[0].pParameter1 = "NEW VALUE";
…因为我可以简单地再次触发AJAX调用,并使用新的参数值进行post。
任何帮助和建议都是非常感激的,谢谢!何时发送:
"pMoreParams":{"pParameter1":"ABC","pParameter2":"XYZ"}
你正在发送一个名为pMoreParams
的对象,它有两个属性。
如果你想从控制器获得这些,你需要创建一个c#对象来镜像你正在发送的JSON。
public class MoreParams
{
public string pParameter1 {get;set;}
public string pParameter2 {get;set;}
}
然后更新你的动作方法:
public string GiveMeJSON(string pSQL, string pSQLServer, MoreParams pMoreParams)
{
var param1 = pMoreParams.pParameter1;
var param2 = pMoreParams.pParameter2;
}
边注
您正在发送供服务器执行的SQL。我知道这很方便,但这是一个巨大的安全问题,将导致SQL注入,这将允许攻击者控制你的SQL服务器。
好的,睡个好觉后,我想我已经提出了一个解决方案,满足我的要求,不必在一个类中定义所有可能的和未来的参数,也满足了一些SQL注入问题,已经阅读了使用参数化;
这是数据I JSON。字符串化并通过AJAX传递给控制器;
var chart01Params = {
pSQLCon: "ConnectionString",
pSQL: "MySQLFile.sql", // accessible only by the server from MapPath
pMoreParams :
[
{
"name" : "pParameterXYZ",
"value": "12345ABC"
},
],
};
…
{"pSQLCon":"ConnectionString","pSQL":"MySQLFile.sql","pMoreParams":[{"name":"pParameterXYZ","value":"12345ABC"}]}
这是我的类;
public class SQLParam
{
public string name { get; set; }
public string value { get; set; }
}
这是我的控制器头;
public string GETMYJSON(string pSQLCon, string pSQL, List<SQLParam> pMoreParams)
…在我的控制器执行SQL命令之前,它会向SQL查询添加任何参数和值,我希望这将使它更安全,免受SQL注入攻击;
foreach (SQLParam parameter in pMoreParams)
{
cmd.Parameters.Add(parameter.name, SqlDbType.Char);
cmd.Parameters[parameter.name].Value = parameter.value;
}
效果很好!如果我想发送查询所需的参数,我可以这样做,而不必将它们包含在类中,而且我还可以使用本地客户端脚本从DOM中获取选择/输入并设置参数值,只要我知道我想要更改的参数值的对象中的索引。