使用 AJAX 到 post 到 ASP.NET C# 控制器

Using AJAX to post to ASP.NET C# controller

我正在尝试将一个 JSON 对象(我从控制台复制了对象,我知道格式有点不对)从视图发送到 ASP.NET 中的控制器.

const obj = {
_405: {ratingID: '_8570', pts: '20'}
_2734: {ratingID: '_9791', pts: '20'}
_4041: {ratingID: 'blank', pts: '20'}
_5649: {ratingID: '_2544', pts: '20'}
_8025: {ratingID: '_4411', pts: '20'}
}

这是我的观点ajax:

$.ajax({
    type: 'POST',
    url: '@Url.Action("SendGrade", "Faculty")',
    data: obj,
    success: function(result) {
       console.log(result)
    }
})

这是我的控制器代码:

[HttpPost]
public ActionResult SendGrade(string rubric){
    Console.WriteLine(rubric);
    return null;  
} 

正在调用控制器,但 rubric 变量为空。我已经看过其他答案,并且在过去的两个小时里一直在尝试,但没有成功。我尝试添加不同的 ajax 属性,例如 conentType 和 dataType,但这没有效果。我还在对象上尝试了 JSON.stringify。此外,我尝试将 JObject 而不是字符串作为控制器函数中的类型,但这会引发 500 错误。任何帮助将不胜感激。我正在使用 ASP.NET 5.

asp.net 控制器具有将输入数据反序列化为对象的默认行为。您输入的 obj 不是字符串,它是您尝试在控制器中使用字符串映射的对象。

您需要创建一个 class 类似于您的输入结构。我已经创建了一个示例代码供您参考。

输入对象

var obj = [
            { ratingID: '_8570', pts: '20' },
            { ratingID: '_9791', pts: '20' },
            { ratingID: 'blank', pts: '20' },
            { ratingID: '_2544', pts: '20' },
            { ratingID: '_4411', pts: '20' }
        ];

此输入匹配 Class

public class Rubric
        {
            public string RatingId { get; set; }
            public int Pts { get; set; }
        }

控制器

[HttpPost]
        public IActionResult Index([FromBody]List<Rubric> rubric)
        {
            Console.WriteLine(rubric);
            return NoContent();
        } 

Javascript 提交代码

function send() {
            $.ajax({
                type: 'POST',
                url: '@Url.Action("Index", "Email")',
                contentType: "application/json",
                data: JSON.stringify(obj) ,
                success: function(result) {
                    console.log(result);
                }
            })
        }

此代码仅供您参考,可为您提供解决问题的思路。

您正在通过 AJAX 发送一个对象。因此,在控制器操作方法中,您不能像(此处)public ActionResult SendGrade(string rubric) 那样传递 string 变量。因为您正在将对象发送到操作方法。你应该像下面这样创建一个 class :

public class Rubric
        {
            public string ratingId { get; set; }
            public string pts { get; set; }     // as you are passing pts as string
        }

并且通过这样做,现在您可以将此 class 作为 Action Method 的参数传递,如下所示:

public ActionResult SendGrade(Rubric object)

现在,最后一个更改是,您应该编写 AJAX 的 data 参数,如下所示:

$.ajax({
    type: 'POST',
    url: '@Url.Action("SendGrade", "Faculty")',
    data: {object : obj},     // the only change you should do in AJAX, as naming rule denotes and you are collecting 'object' in action method.
    success: function(result) {
       console.log(result)
    }
})

通过这样做,您应该在控制器操作方法中获取值。

注意:我们在action方法中声明的变量传递时,必须与AJAX数据参数相同。这就是为什么 data : { object : obj } 写成 AJAX.