【发布时间】:2014-09-22 14:21:45
【问题描述】:
我的联系人控制器操作总是收到一个空对象。我错过了什么?
控制器
(我在mail.Body赋值处加了断点,整个message对象为null)
[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;
}
}
在视图中触发的 javascript
<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 的 回答,消息对象不再完全为空,而是一个具有空 Name、EmailAddress 和 Message 属性的 ContactMessage 对象。
感谢 ramiramilu 的 和 ekad 的 的回答,我还添加了 contentType 属性
更新代码:
[HttpPost]
public ActionResult Contact(ContactData data)
{
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 = data.Message;
client.Send(mail);
return Json(new { success = true });
}
<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({ message: msg }),
contentType: "application/json; charset=utf-8"
}).success(function (response) {
if (response.success) {
alert("success");
} else {
alert("not success");
}
}).fail(function () {
alert("fail");
});
}
});
});
</script>
【问题讨论】:
-
顺便说一句 - 你不需要在构造函数中设置
this.Delivered = false;。bool的默认值为false。 -
public ActionResult Contact(ContactMessage message) ...您没有将消息对象发布到您的控制器。 想知道你为什么要使用ajax来发送电子邮件,普通视图帖子/表单属性方法有什么问题。
-
您在消息中包含一条消息,除非您希望它是递归的,否则这是不对的,命名可能意味着很多。
-
@greatbear302 facepalm 谢谢!
-
@anywyatt 如果您将视图的模型(@model 消息 - 因此视图知道模型的类型)定义为消息类型,则当您将消息对象回发到控制器时,在整个过程中使用您的消息对象(只要您不使用复杂对象,因为事情会变得有点混乱),任何值都会在一个简洁的操作(就您而言)中自动传递(映射)到控制器(参数) / 错误(您的消息对象不是))。使用 JSon / Ajax 来实现这一点在我看来有点混水。
标签: c# jquery asp.net ajax asp.net-mvc