【问题标题】:JSON not deserialized to object when doing AJAX post to MVC action将 AJAX 发布到 MVC 操作时,JSON 未反序列化为对象
【发布时间】:2016-11-24 21:53:32
【问题描述】:

我想首先说我已经尝试了关于这个问题的大多数 SO 答案,但他们没有解决这个问题。

通过 jQuery ajax 请求发布到我的控制器操作时遇到问题。

这是我的 JSON 对象:

var service = {
        ServiceID: $('#ServiceID').val(),
        ServiceName: $('#ServiceName').val(),
        ServiceActive: $('#ServiceActive').val(),
        ServiceDescriptionShort: $('#ServiceDescriptionShort').val(),
        ServiceDescription: $('#ServiceDescription').val()            
    };

这是我的课:

public class ServiceJson
{
    public int ServiceID
    {
        get;
        set;
    }

    public string ServiceName
    {
        get;
        set;
    }

    public bool ServiceActive
    {
        get;
        set;
    }

    public string ServiceDescriptionShort
    {
        get;
        set;
    }

    public string ServiceDescription
    {
        get;
        set;
    }
}

这是我的行动(现在什么都不做,但这不是重点):

[HttpPost]
[Route("edit")]
[ValidateJsonAntiForgeryToken]
public JsonResult Edit(ServiceJson service)
{
    return Json("", JsonRequestBehavior.AllowGet);
}

最后,这是我的 ajax 请求:

$.ajax(
{
    type: 'POST',
    url: '@Url.ActionWithoutData("edit", "service")',
    data: JSON.stringify(service),
    headers: {
        "__RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val()
    },
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    processData: false,
    contentType: false,
    success: function (responseData) {
        $('#ServiceID').val(responseData.ServiceID);
        $.snackbar({ content: 'Successfully saved.' });
    },
    error: function (xhr, ajaxOptions, thrownError) {
        $('#errorMessage').html(xhr.responseJSON.Message);
        $('#error').modal('toggle');
    }
});

我的问题是这个 JSON 对象没有序列化到我的类中。显然名称对应。我确信我错过了一些微不足道的东西,因为我尝试使用简单的参数,比如只传递名称(当然还有更改动作参数以对应它),但没有运气。我可以在 Request 对象中看到我正在接收我的数据,但它没有被反序列化为我的对象。

在浏览器中我也可以看到对象被正确传递了。

救命!

【问题讨论】:

  • 只需 data: service, 并删除 contentType: 'application/json; charset=utf-8',processData: false,contentType: false,
  • 关于你的action参数ServiceJson服务为null?
  • ActionWithoutData to Action?

标签: jquery json ajax asp.net-mvc post


【解决方案1】:

删除下面的这些,你应该很高兴。

数据类型:'json',
处理数据:假,
内容类型:假,

在这种情况下,processData 应该不会给您带来任何问题。

dataType" 'json' 是错误的,因为您发送的是字符串而不是 JSON。请注意 JSON.Stringify() 调用。

"contentType: false" 不会在这里发送给我:p

【讨论】:

  • 这成功了。我必须说我不太了解所有这些参数以及它们如何转换为 MVC。
  • dataType" 'json' 没有错,可以/应该保留 - dataType 选项指定从服务器接收的内容并且方法返回 json!
  • @StephenMuecke 它是 JSON 格式,但它是一个字符串而不是 JavaScript 对象。 content-type 表示字符串应该作为 JSON 对象被读取和反序列化。
  • 这与我的评论有什么关系 - 这是关于 dataType 而不是 contentType!!
【解决方案2】:

如果您使用默认的 .Net JSON 序列化器,您必须将服务对象的命名从帕斯卡大小写更改为骆驼大小写:

var service = {
    serviceID: $('#ServiceID').val(),
    serviceName: $('#ServiceName').val(),
    serviceActive: $('#ServiceActive').val(),
    serviceDescriptionShort: $('#ServiceDescriptionShort').val(),
    serviceDescription: $('#ServiceDescription').val()            
};

【讨论】:

  • 这不是真的。命名约定与这个问题没有任何关系。
猜你喜欢
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多