【问题标题】:Controller always received null arguments控制器总是收到空参数
【发布时间】: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 的 回答,消息对象不再完全为空,而是一个具有空 NameEmailAddressMessage 属性的 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


【解决方案1】:

由于控制器动作方法中的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>

另外,上面代码中JSON.stringify方法中的参数名称(data):

JSON.stringify({ data: msg })

必须与控制器中Contact动作方法的参数名相同:

public ActionResult Contact(ContactData data)

【讨论】:

  • 进步!现在,消息不是完全为空,而是具有空属性。还有其他建议吗?
  • msg 值用双引号代替单引号?
  • 以上代码只会发送NameEmailAddressMessage属性。如果要将值发送到其他属性,则需要将值添加到 msg 变量。
  • @ekad 这 3 个属性作为空值通过。
  • @drewwyatt 你是如何最终修复/解决空属性的?我遇到了同样奇怪的问题
【解决方案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");
                });
    });

当我运行代码时 -

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多