【问题标题】:How to pass multiple objects with Json Stringify?如何使用 Json Stringify 传递多个对象?
【发布时间】:2022-08-16 11:26:45
【问题描述】:

如何使用 Json Stringify 传递多个对象? string[] 活动已填充,如果我暂时删除它,则 playerLevels 将被填充。

我对 javascript 还是很陌生,所以不太确定要尝试什么

下面是我的代码

        let collection = document.getElementsByClassName(\"skill-icon-selected\");
        const skillsChosen = new Array;
        for (var i = 0; i < collection.length; i++)
        {
            var split = collection[i].id.split(\"-\");
            skillsChosen.push(split[0]);
        }

        let levelCollection = document.getElementsByClassName(\"skill-input\");
        const playerLevels = new Array;        
        for (var i = 0; i < levelCollection.length; i++)
        {
    
            playerLevels.push(levelCollection[i].value);
            
        }

        $.ajax({
            url: \"/index?handler=GetActivity\",
            type: \"POST\",
            contentType: \'application/json\',
            dataType: \"json\",
            data: JSON.stringify(skillsChosen, playerLevels),
             headers: {
                RequestVerificationToken:
                    $(\'input:hidden[name=\"__RequestVerificationToken\"]\').val()
            },
            success: function(result)
            {
                console.log(result);
            },
            error: function(e)
            {
                console.log(e);
            },

            contentType: \"application/json\"
        });

cshtml.cs

  public IActionResult OnPostGetActivity([FromBody] string[] activities, [FromBody] int[] playerLevels)
        {
            allActivities = _context.Activities.ToList();

            if (activities.Length > 0)
            {
                System.Diagnostics.Debug.WriteLine(\"testing \" + activities[0]);
            }
            foreach (Activity activity in allActivities)
            {
                if (activities.Contains(activity.Skill.ToLower()))
                {
                    //if user skill is between min and max

                    System.Diagnostics.Debug.Write(activity.ActivityName);
                }
            }
            return new JsonResult(\"testing\");
        }
  • 我认为您的数据对象应该是{ activities: skillsChosen, playerLevels },也不确定为什么需要对其进行字符串化
  • 嗨@Pete我试了一下(有和没有stringify)并且活动在调试时在cshtml.cs中显示为null
  • 您是否尝试过删除[FromBody]
  • @Pete string[] 活动然后变为空(不为空),不确定这是否有帮助

标签: javascript c# jquery asp.net-core razor


【解决方案1】:

JSON.stringify 的第二个参数不应该是第二个值(the documentation

如果你想同时序列化两个变量,你可以把它们放在一个像这样的对象中

JSON.stringify([{skillsChosen, playerLevels}),

【讨论】:

  • 嗨,我应该放入原始帖子,我尝试过,但它通过 null 传递给我的方法,我不确定是否需要在我的 cshtml.cs 中以不同的方式处理它
  • 好的,那么我认为 Pete 对您的问题的建议可能会奏效:{ activities: skillsChosen, playerLevels } 应该允许您访问名为 activitiesskillsChosen 变量的内容。我不太熟悉您如何在其余代码中获取数据,但如果您有任何问题,它不应该出现在 javascript 方面
  • 嗯,我已经尝试过,在 Pete 建议并且 .cshtml.cs 中的活动仍然为空之后,我想 C# 方面出了点问题
  • 好的,所以我检查了this question,也许有人可以在那里使用。也许尝试使用[]string activities[]int playerlevels 创建一个类,然后使用[FromBody] NameOfYourModelClass variableName
  • 嗯,我刚刚试过,变量为空,你知道我将如何在 ajax 请求中格式化我的数据吗?
【解决方案2】:

我认为您最好创建一个包含string[]int[] 的模型:

var model={"activities":skillsChosen,"playerLevels":playerLevels};
 $.ajax({
            url: "/index?handler=GetActivity",
            type: "POST",
            contentType: 'application/json',
            dataType: "json",
            data: JSON.stringify(model),
             headers: {
                RequestVerificationToken:
                    $('input:hidden[name="__RequestVerificationToken"]').val()
            },
            success: function(result)
            {
                console.log(result);
            },
            error: function(e)
            {
                console.log(e);
            },

            contentType: "application/json"
        });

模型:

public class TestModel{
 public string[] activities{get;set;}
 public int[] playerLevels{get;set;}
}

cshtml.cs:

public IActionResult OnPostGetActivity([FromBody]TestModel testModel)
        {
            allActivities = _context.Activities.ToList();

            if (activities.Length > 0)
            {
                System.Diagnostics.Debug.WriteLine("testing " + activities[0]);
            }
            foreach (Activity activity in allActivities)
            {
                if (activities.Contains(activity.Skill.ToLower()))
                {
                    //if user skill is between min and max

                    System.Diagnostics.Debug.Write(activity.ActivityName);
                }
            }
            return new JsonResult("testing");
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多