繁体   English   中英

在C#控制器中读取JSON对象/数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM