在C#控制器中读取JSON对象/数组
首先,我为任何不正确的术语提前道歉!我读了那么多关于我如何做到这一点的博文和文章,已经完全失去理智,陷入了僵局 我已经成功地通过AJAX将参数传递给控制器中的MVC操作,它以JSON格式返回SQL数据表,供我在页面中使用。我发送的一组参数示例如下所示:在C#控制器中读取JSON对象/数组,c#,json,ajax,asp.net-mvc,C#,Json,Ajax,Asp.net Mvc,首先,我为任何不正确的术语提前道歉!我读了那么多关于我如何做到这一点的博文和文章,已经完全失去理智,陷入了僵局 我已经成功地通过AJAX将参数传递给控制器中的MVC操作,它以JSON格式返回SQL数据表,供我在页面中使用。我发送的一组参数示例如下所示: var parameters = { pSQL: "SELECT * FROM v_MyTable", pSQLServer: "SERVER01", }; $.ajax({ type: 'POST', url:
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
}
var parameters = {
pSQL: "SELECT * FROM v_MyTable",
pSQLServer: "SERVER01",
pMoreParams: {
pParameter1: "ABC",
pParameter2: "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);
}
};
我的客户端脚本如下所示
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
}
var parameters = {
pSQL: "SELECT * FROM v_MyTable",
pSQLServer: "SERVER01",
pMoreParams: {
pParameter1: "ABC",
pParameter2: "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);
}
};
我的控制器动作就是这样工作的
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
}
var parameters = {
pSQL: "SELECT * FROM v_MyTable",
pSQLServer: "SERVER01",
pMoreParams: {
pParameter1: "ABC",
pParameter2: "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);
}
};
这对我来说非常有效。我将JSON请求数据作为POST发送,并接收JSON数据作为返回。太棒了
现在,我想扩展我的操作的功能,这样我就可以将一组额外的变量作为数组传递给它,类似这样的东西
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
}
var parameters = {
pSQL: "SELECT * FROM v_MyTable",
pSQLServer: "SERVER01",
pMoreParams: {
pParameter1: "ABC",
pParameter2: "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);
}
};
…其中MoreParams中的参数名称可以调用任何类型的值。这很重要,因为我认为这排除了使用模型的可能性
这导致POST请求主体看起来像这个有效的JSON
{"pSQL":"SELECT * FROM v_MyTable","pSQLSERVER":"SERVER01","pMoreParams":{"pParameter1":"ABC","pParameter2":"XYZ"}}
因此,我需要的数据显然要送到服务器,但我确实很难枚举/访问PMoReparms数组中的那些附加项。我似乎越来越接近了,我已经用
public string GiveMeJSON(string pSQL, string pSQLServer, List<string> pMoreParams)
…并使用控制器执行类似以下操作:
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
}
var parameters = {
pSQL: "SELECT * FROM v_MyTable",
pSQLServer: "SERVER01",
pMoreParams: {
pParameter1: "ABC",
pParameter2: "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);
}
};
…然后,我可以简单地再次触发AJAX调用,并使用新的参数值发布
非常感谢您的帮助和建议,谢谢 当您发送时:
"pMoreParams":{"pParameter1":"ABC","pParameter2":"XYZ"}
您正在发送一个名为pmorepams
的对象,该对象有两个属性
如果您想从控制器中获取这些信息,则需要创建一个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 server 好的,睡个好觉之后,我想我已经找到了一个解决方案,它满足了我的要求,不必在一个类中定义我所有可能的和未来的参数,并且还满足了一些SQL注入问题,已经阅读了使用参数化的相关知识 下面是数据I JSON.stringify并通过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)
而且效果很好!如果我想发送查询所需的参数,我可以这样做,而不必将它们包含在类中,而且我仍然可以使用本地客户端脚本从DOM获取选择/输入,并设置参数值,只要我知道要更改的参数值的对象中的索引
谢谢你的阅读!在您否决某人的问题之前,请记住,并非所有人都是语言表达能力强且阅读过每一本书的编码专家,博客和MSDN文章在来这里寻求帮助之前就已经存在了——有时候,他们只是来这里寻求任何人都无法提供的清晰性。是定义我在类中可能提前使用的所有参数名称的唯一方法吗?“我觉得奇怪的是,我很快就可以将pmoreparms循环x次,但在没有先定义其中可能包含的内容的情况下却无法阅读其中的内容?”安德鲁同意安德烈斯·纳瓦关于旁注的看法——这是一件非常危险的事。是的,我不太热衷于检索,修改和发送SQL,但这是一个开始,而该产品仍在开发中,但现在有了我新发现的参数化技术,我在下面的回答中发现,我现在应该能够更安全地做事情。谢谢。我想问一下,允许某人通过http访问任何服务器上的任何表,您想从中获得什么我知道您发布的可能不是您的代码1-1,但这是一个主要的安全问题,正如André所指出的,上面的代码过于简化了-pSQL参数是服务器文件系统本地预定义的.sql文件的名称,服务器读取该文件,添加任何提供的参数,执行并返回JSON。pSQLServer参数实际上也不是服务器或连接字符串,而是对服务器端数据库值的引用,该数据库值包含仅由应用程序管理员创建和访问的连接字符串。我很高兴,一旦我重做我以前的一些代码,在控制器中使用参数化,应用程序就开始抵制SQLInjection了。