【问题标题】:Passing data in ajax post issue在ajax发布问题中传递数据
【发布时间】:2017-07-14 22:48:29
【问题描述】:

场景:

需要将一个包含子对象列表的对象传递给控制器​​。

问题:

我能够获取对象的值,但不能获取对象内子对象列表的值。

代码:

index.cshtml

function sendData() {
    var student = {
        Id: 1,
        Name: "xxx",
        Marks: [{
            Subject: "Maths",
            Mark:80
        },
        {
            Subject: "Science",
            Mark: 75
        }]
    }
    $.ajax({
        url: '@Url.Action("Receive", "Home")',
        data: student,
        success: function (data) {
            alert("done");
        },
        error: function (error) {
            alert('error For details refer console log');
            console.log(error);
        }
    });
}

HomeController.cs

public ActionResult Receive(Student student)
    {
        ViewBag.Message = "Your contact page.";
        return View();
    }

Student.cs

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Marks> Marks { get; set; }
}
public class Marks
{
    public string Subject { get; set; }
    public decimal Mark { get; set; }
}

截图:

Chrome 调试器显示所有数据均已设置。

但在控制器中我没有得到 Marks 的值

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: javascript c# ajax asp.net-mvc


    【解决方案1】:

    您需要对数据进行字符串化,并设置 contentTypetype ajax 选项(注意它必须是 POST,否则您需要使用带点的完全限定属性名称以不同的方式生成数据符号 - 例如{ Id: 1, .... , 'Marks[0].Subject': 'Maths', 'Marks[0].Mark': 80, ... },在这种情况下,您现有的 ajax 代码无需修改即可工作)

    var student = {
        ....
    };
    
    $.ajax({
        url: '@Url.Action("Receive", "Home")',
        data: JSON.stringify({ student: student }, // stringify
        type: 'POST', // add
        contentType: "application/json; charset=utf-8", //add
        success: function (data) {
            alert("done");
        },
        ....
    });
    

    请注意,您的方法正在返回一个视图,但您没有对该视图执行任何操作。如果您打算使用该视图更新 DOM,则方法应为 return PartialView( ... ); 并在 ajax 成功回调中,

    success: function (data) {
        $(someElement).html(data);
    },
    

    【讨论】:

    • 谢谢@Stephen。完美运行。只是好奇,为什么它不能在 GET 方法中工作?
    • 因为 GET 调用没有正文,并且值来自查询字符串(或路由值)并且 DefaultModelBinder 无法匹配您发送的数据(查看您生成的 url了解)。
    • 但如果数据按照第一段中的注释进行格式化,它将起作用——即名称的格式与您用于访问 c# 代码中属性值的格式相同。
    • 当您执行 ajax POST 时,数据在正文中发送,通过设置 contentType 选项,DefaultModelBinder 从请求标头中读取,因此使用 JsonValueProviderFactory类来反序列化您的数据
    • 再次感谢@Stephen。
    猜你喜欢
    • 2019-01-07
    • 2020-04-03
    • 1970-01-01
    • 2018-12-12
    • 2017-04-18
    • 1970-01-01
    • 2023-03-23
    • 2016-12-01
    • 2013-01-10
    相关资源
    最近更新 更多