问题描述
因此,在按钮上单击有一个功能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助手的默认设置可以很好地满足您的显示要求。