[英]Reading JSON objects/arrays within a C# Controller
首先,对于任何不正确的术语,我深表歉意! 我盲目地阅读了许多博客文章和文章,以探讨如何做到这一点,并陷入僵局。
我已经成功地通过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
}
这对我来说一直很好。 我以POST的形式发送JSON请求数据,并作为回报接收JSON数据。 辉煌。
现在,我想扩展动作的功能,以便可以将数组作为一组附加变量传递给它,就像这样;
var parameters = {
pSQL: "SELECT * FROM v_MyTable",
pSQLServer: "SERVER01",
pMoreParams: {
pParameter1: "ABC",
pParameter2: "XYZ",
}
};
...在其中,MoreParams中的参数名称可以称为任何名称,具有任何类型的值。 这很重要,因为我认为可以排除使用模型吗?
这导致POST请求BODY看起来像此Valid JSON;
{"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 Server。
好吧,睡了好觉之后,我想我想出了一个满足我的要求的解决方案,不必在类中定义所有可能的和将来的参数,并且还满足了一些有关SQL注入的关注,已经阅读了使用参数化的内容。 ;
这是我JSON.stringify并通过AJAX传递到控制器的数据;
var chart01Params = {
pSQLCon: "ConnectionString",
pSQL: "MySQLFile.sql", // accessible only by the server from MapPath
pMoreParams :
[
{
"name" : "pParameterXYZ",
"value": "12345ABC"
},
],
};
...在POST请求正文中看起来像这样;
{"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 Injection攻击的威胁;
foreach (SQLParam parameter in pMoreParams)
{
cmd.Parameters.Add(parameter.name, SqlDbType.Char);
cmd.Parameters[parameter.name].Value = parameter.value;
}
而且效果很好! 如果我想发送查询期望的参数,则可以不必在类中包含它们而这样做,而且我仍然可以使用本地客户端脚本从DOM中进行选择/输入,并将参数值设置为只要我知道要更改的参数值对象中的索引。
谢谢阅读! 在对某人的问题投反对票之前,请记住,并不是每个人都是编码专家,他们都具有充分的语言表达能力,并且在来这里寻求帮助之前已经阅读了存在的每本书,博客和MSDN文章-有时他们只是出于某种目的而来这里任何人都无法提供的清晰度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.