我的联系人控制器操作始终收到一个空对象。我错过了什么?
(我在mail.Body赋值中添加了断点,整个消息对象为空)
[HttpPost]
public ActionResult Contact(ContactMessage message)
{
var mail = new MailMessage();
var client = new SmtpClient("localhost");
mail.From = new MailAddress("************");
mail.To.Add(new MailAddress("****************"));
mail.Subject = "New Message from *************.com";
mail.Body = message.Message;
client.Send(mail);
return Json(new { success = true });
}
public class ContactMessage
{
[Required]
[PlaceHolder("john.smith@example.com")]
public string EmailAddress { get; set; }
[Required]
[PlaceHolder("John Smith")]
public string Name { get; set; }
[Required]
[PlaceHolder("I am interested in...")]
[DataType(DataType.MultilineText)]
public string Message { get; set; }
public bool Delivered { get; set; }
public ContactMessage()
{
this.Delivered = false;
}
}
<script>
$(document).ready(function () {
$("#contactForm").submit(function (event) {
event.preventDefault();
var $form = $(this);
if ($form.valid()) {
$.ajax({
url: "/Contact",
type: "POST",
data: { Name: 'boom', EmailAddress: 'pow', Message: 'boom boom pow' }
}).success(function (response) {
if (response.success) {
alert("success");
} else {
alert("not success");
}
}).fail(function () {
alert("fail");
});
}
});
});
</script>
我也试过用Postman发送数据 - 但这似乎也导致了一个空对象。
我做了一些改变(和进步),但仍然有问题。
关于错误命名的 Paul Zahra 建议,现在ContactData中的类(不是ContactMessage)
通过关注 ekad 回答,消息对象不再完全为null,而是具有空Name
,EmailAddress
和{{的ContactMessage对象1}}属性。
我还添加了contentType属性,感谢 ramiramilu 和 ekad 的答案
更新的代码:
Message
答案 0 :(得分:6)
由于控制器操作方法中的message
不是javascript原始类型,因此在传递参数时需要使用JSON.stringify
。更改您的javascript如下:
<script>
$(document).ready(function () {
$("#contactForm").submit(function (event) {
event.preventDefault();
var $form = $(this);
var msg = { Name: "boom", EmailAddress: "pow", Message: "boom boom pow" };
if ($form.valid()) {
$.ajax({
url: "/Contact",
type: "POST",
data: JSON.stringify({ data: msg }),
contentType: "application/json; charset=utf-8"
}).success(function (response) {
if (response.success) {
alert("success");
} else {
alert("not success");
}
}).fail(function () {
alert("fail");
});
}
});
});
</script>
此外,上面代码中的data
方法中的参数名称(JSON.stringify
):
JSON.stringify({ data: msg })
必须与控制器中Contact
操作方法的参数名称相同:
public ActionResult Contact(ContactData data)
答案 1 :(得分:2)
在JQuery代码中,设置 -
contentType: "application/json; charset=utf-8"
修改强>
我尝试过这个课程 -
public class ContactMessage
{
[Required]
public string EmailAddress { get; set; }
[Required]
public string Name { get; set; }
[Required]
[DataType(DataType.MultilineText)]
public string Message { get; set; }
public bool Delivered { get; set; }
public ContactMessage()
{
this.Delivered = false;
}
}
然后我简化了你的控制器动作 -
[HttpPost]
public ActionResult Contact(ContactMessage message)
{
return Json(new { success = true });
}
然后我简化了您的查询代码 -
$(document).ready(function () {
var msg = { Name: "boom", EmailAddress: "pow", Message: "boom boom pow" };
$.ajax({
url: "/home/Contact",
type: "POST",
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ message: msg })
}).success(function (response) {
if (response.success) {
alert("success");
} else {
alert("not success");
}
}).fail(function () {
alert("fail");
});
});
当我运行代码时 -