控制器总是收到空参数

时间:2014-09-22 14:21:45

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

我的联系人控制器操作始终收到一个空对象。我错过了什么?

控制器

(我在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;
    }
}

在视图中触发的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发送数据 - 但这似乎也导致了一个空对象。

enter image description here


更新

我做了一些改变(和进步),但仍然有问题。

关于错误命名的 Paul Zahra 建议,现在ContactData中的类(不是ContactMessage)

通过关注 ekad 回答,消息对象不再完全为null,而是具有空NameEmailAddress和{{的ContactMessage对象1}}属性。

我还添加了contentType属性,感谢 ramiramilu ekad 的答案

更新的代码:

Message

2 个答案:

答案 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");
                });
    });

当我运行代码时 -

enter image description here