C# mvc 应用程序中 ajax 中的多个参数失败 - 添加了更多信息

Multiple arguments failing in ajax in a C# mvc app - More info added

我在这里遗漏了一些东西。这是我的控制器方法

public void SubmitSweep(int personID, int DD, int MM, int YYYY, int hh, int mm, int dealId)

这是我的按钮定义

<button id="submit@(person.Id)" class="btn btn-secondary" OnClick="submitSweep(@(person.Id), @(person.sweepDay), @(person.sweepMonth), @(person.sweepYear), @(person.sweepHour), @(person.sweepMinutes), @(person.dealId))">Submit Sweep</button>

这是我的 JS 函数

function submitSweep(thePersonID, sweepDay, sweepMonth, sweepYear, sweepHours, sweepMinutes, theDealId) {
        
        $.ajax({
            type: 'POST',
            url: '@Url.Action("SubmitSweep", "Home")',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: JSON.stringify({ personID: thePersonID, DD: sweepDay, MM: sweepMonth, YYYY: sweepYear, hh: sweepHours, mm: sweepMinutes, dealId: theDealId }),
            success: function (data) {
                alert("Success");
            },
            error: function (ob, errStr) {
                alert("An error occured.Please try after sometime." + errStr + " " + ob.responseText);
            }
        });
    }

正在调用函数并填充参数。我四处寻找并确定问题出在 AJAX 数据字段。如果我在控制器中没有参数,我就会到达我的断点,所以确信错误在我的数据行中。

如果我将我的 JS 函数编辑成这样

function submitSweep(thePersonID, sweepDay, sweepMonth, sweepYear, sweepHours, sweepMinutes, theDealId) {
        
        var obj = {};
        obj.personID = thePersonID;
        obj.DD = sweepDay;
        obj.MM = sweepMonth;
        obj.YYYY = sweepYear;
        obj.hh = sweepHours;
        obj.mm = sweepMinutes
        obj.dealId = theDealId;

        $.ajax({
            type: 'POST',
            url: '@Url.Action("SubmitSweep", "Home")',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: obj, 
            success: function (data) {
                alert("Success");
            },
            error: function (ob, errStr) {
                alert("An error occured.Please try after sometime." + errStr + " " + ob.responseText);
            }
        });
    }

我收到标记中返回的错误,标题标签显示无效 JSON 原语:personID。请注意,我在数据元素中传递了 obj。

如果我把数据线改成

data: JSON.stringify(obj),

然后我得到标记,标题包含已添加具有相同键的项目。在以上两种情况下,我的控制器断点都没有命中。

我是 运行 VS 2022,我猜 sp 主要是较新的库。

任何帮助或指点将不胜感激。

干杯

J

由于您使用的是 json,因此您必须从正文中读取数据。在action中只能从body获取一个输入参数。所以你需要一个视图模型

public class ViewModel
{
public int personID {get; set;}
public int DD {get; set;}
public int MM {get; set;} 
public int YYYY {get; set;}
public int hh {get; set;}
public int mm {get; set;}
public int dealId {get; set;}
}

和行动

public ActionResult SubmitSweep([FromBody] ViewModel model)
{

}

或者,如果您想保持动作不变,您必须从 ajax 中删除 contentType:json,并且不要将对象

字符串化
$.ajax({
            type: 'POST',
            url: '@Url.Action("SubmitSweep", "Home")',
            dataType: "json",
            data: obj, 
           ...

解决了它,我想我会分享它以防万一其他人有同样的脑衰竭我刚刚浪费了几天时间!

问题出在我的控制器方法签名上。我将它从上面的原始问题中更改为

public void SubmitSweep(int personID, int day, int month, int year, int hour, int minute, int dealId)

更改了我的 JS 函数中的参数名称以匹配这样

function submitSweep(thePersonID, sweepDay, sweepMonth, sweepYear, sweepHours, sweepMinutes, theDealId) {
        
        var obj = {};
        obj.personID = thePersonID;
        obj.day = sweepDay;
        obj.month = sweepMonth;
        obj.year = sweepYear;
        obj.hour = sweepHours;
        obj.minute = sweepMinutes;
        obj.dealId = theDealId;

        $.ajax({
            type: 'POST',
            url: '@Url.Action("SubmitSweep", "Home")',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: JSON.stringify(obj), 
            success: function (data) {
                alert("Success");
            },
            error: function (ob, errStr) {
                alert("An error occured.Please try after sometime." + errStr + " " + ob.responseText);
            }
        });
    }

现在可以了。显然 JS 和 C# 一样区分大小写,但是发布的 URL “不是”。希望这会帮助那些愚蠢地为自己制造同样问题的人。记住教训,始终使用有意义的变量名!

J