【问题标题】:Invalid JSON primitive On Post发布时无效的 JSON 原语
【发布时间】:2019-01-31 13:40:30
【问题描述】:

我知道这个问题已经在 Stakoverflow 中被问过多次。但是没有一个解决方案对我有帮助。谁能告诉我做错了什么

我有一个控制器动作如下

<HttpPost()>
    Function WFUserEdited(ByVal userdetails As userdetails) As ActionResult
            Return View()
    End Function

我的 Viewmodel 如下所示

Public Class userdetails
    Public Property Username As String
    Public Property Password As String
    Public Property Fullname As String
    Public Property Location As String
    Public Property Appcode As String
    Public Property Userlevel As String
End Class

我的 Jquery Ajax 调用如下所示

 $("#btnSubmit").click(function () {
                var q = validate();
                if (q = true) {
                    var userdetails = {};
                    userdetails.UserName = $('#txtusername').val().toString();
                    userdetails.Password = $('#txtPassword').val().toString();
                    userdetails.Fullname = $('#txtfullName').val().toString();
                    userdetails.Location = $('#txt_location').val().toString();
                    userdetails.Appcode = $("#drp_appcode").chosen().val().toString();
                    userdetails.Userlevel = $("#drp_userlevel").chosen().val().toString();
                    userdetails = JSON.stringify(userdetails);
                    var url = '@Url.Action("WFUserEdited", "WFUser")';

                    $.ajax({
                        url: url,
                        type: 'POST',
                        traditional: false,
                        contentType: "application/json; charset=utf-8",
                        dataType: 'json',
                        data: { "userdetails": userdetails },
                        success: function (data) {
                        },
                        error: function (data) {
                        }
                    });
                }
            });
        });

在 Beginexecutecore 我得到以下异常

 Protected Overrides Function BeginExecuteCore(callback As AsyncCallback, state As Object) As IAsyncResult
        Try
            ViewBag.UserImage = "http://_layouts/15/CaptarisWFTasksWebPart/EmployeeImages/sree.jpg"

        Catch generatedExceptionName As Exception
            Return MyBase.BeginExecuteCore(callback, state)
        End Try
        Return MyBase.BeginExecuteCore(callback, state)
    End Function

System.Web.Mvc.dll 中出现“System.ArgumentException”类型的异常,但未在用户代码中处理 附加信息:无效的 JSON 原语:userdetails。

【问题讨论】:

  • 您已经对userdetails 进行了字符串化,所以它只是data: userdetails(或更简单——只需删除userdetails = JSON.stringify(userdetails); 行和contentType: "application/json; charset=utf-8", 选项,然后使用data: userdetails(和您的traditional: false,毫无意义,就像你所有的.toString())
  • 你能不能把它作为答案,以便我可以接受,以便有人可以轻松使用它。同时,如果可能的话,你能建议我在哪里可以阅读这些 json 和 stingify +ajax 的东西跨度>
  • 经过您的更正后它可以正常工作

标签: ajax asp.net-mvc vb.net razor


【解决方案1】:

当您指定contentType: "application/json 时,您必须将您发送为 JSON 的数据字符串化。在您的情况下,数据是 javascript 对象`(其中包含一些字符串化数据),而不是 JSON。

由于userdetails已经被字符串化(使用JSON.stringify()),那么将ajax代码改为

$.ajax({
    url: url,
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    data: userdetails,
    success: function (data) {
        ...
});

但是,无需将其作为 JSON 发送。你可以使用默认的'application/x-www-form-urlencoded; charset=UTF-8'

删除userdetails = JSON.stringify(userdetails);这行代码,然后就删除了

$.ajax({
    url: url,
    type: 'POST',
    dataType: 'json',
    data: userdetails,
    success: function (data) {
        ...
});

请注意,在这两种情况下,您都可以省略 traditional: false 选项。

如果您使用HtmlHelper 方法正确生成了表单控件以绑定到您的模型属性,那么您不需要手动创建object。您可以简单地使用.serialize()。此外,您应该处理表单提交事件,而不是按钮单击事件,并检查.valid()

$('form').submit(function(e) {
    e.preventDefault();
    if (!$(this).valid()) {
        return;
    }
    var userdetails = $(this).serialize();
    var url = '@Url.Action("WFUserEdited", "WFUser")';
    $.ajax({
        url: url,
        type: 'POST',
        dataType: 'json',
        data: userdetails,
        success: function (data) {
            ...
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    相关资源
    最近更新 更多