微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ajax使用javascript发布对象,但后端的值为null,为什么?

如何解决Ajax使用javascript发布对象,但后端的值为null,为什么?

因此,在按钮上单击有一个功能sendEmail()。警报工作正常,我可以在那里查看我的数据。但是在后端我什么都看不到,只是一切都为空。

   function sendEmail() {
        var datas = new Object();
        datas.mail = $('#contactDropdownList').val();
        datas.mailobject = $('#emailObject').val();
        datas.text = $('#emailText').val();enter code here
    
        alert(datas.mail + datas.mailobject + datas.text);
    
        $.ajax({
            type: "POST",dataType: "json",url: "/Email/sendEmail",contentType: 'application/json; charset=UTF-8',data: JSON.stringify({ items: datas }),success: function (data) {
                console.log(data);
                //do something with data
            },error: function (jqXHR,textStatus,error) {
                //log or alert the error
                console.log(error);
            }
        });
    
    }

C#代码

 public class MyClass
    {
        public string Email { get; set; }
        public string Object { get; set; }
        public string Text { get; set; }

    }

[HttpPost]
public IActionResult sendEmail(MyClass items)
{
    return Json(new { data="Ok" });
}

items.Email,items.Object和items.Text为空。 而且返回值也为null,因为在javascript成功中:function(data){console.log(data); 是空字符串。

可能是什么问题?谢谢!

解决方法

模型联编程序期望json内容与C#类匹配。您的datas对象应该看起来像这样

var datas = {
   email: $('#contactDropdownList').val(),object: $('#emailObject').val(),text: $('#emailText').val()
}

由于包装了对象({ items: datas },您可能会认为它会映射到sendEmail(MyClass items),但实际上items的名称并不重要,因此可以将变量名称更改为任何您喜欢的其他名字

确保将[FromBody]属性应用于这样的参数

[HttpPost]
public IActionResult sendEmail([FromBody]MyClass items)

完整演示:

<script>
    
    function sendSmth() {
        var data = {
            Email: 'email',Object: 'object',Text: 'text'
        };

        $.ajax({
            type: "POST",dataType: "json",url: "/home/index",contentType: "application/json",data: JSON.stringify(data),success: function (datas) {
                console.log(datas)
            }
        })
    }
</script>

和控制器

[HttpPost]
public IActionResult Index([FromBody]MyClass obj)
{
    return View();
}
,

正如某人所指出的,发送给控制器的内容与Modelbinder期望的模型之间不匹配。您还可以极大地简化您的AJAX代码:

function sendEmail() {
    var data = {
        Email: $('#contactDropdownList').val(),Object: $('#emailObject').val(),Text: $('#emailText').val()
    };
        
    $.post("/Email/sendEmail",data)
        .done(function (response) {
            console.log(response);
            //do something with response
        })
        .fail(function (jqXHR,textStatus,error) {
            //log or alert the error
            console.log(error);
        });
}

您实际上不需要指定内容类型或数据类型-$ .post助手的默认设置可以很好地满足您的显示要求。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。