【问题标题】:JSON.stringify is sending empty stringJSON.stringify 正在发送空字符串
【发布时间】:2014-03-10 11:04:49
【问题描述】:

我在 asp.net 中使用 jQuery 1.7.2 和 jQuery Validation 1.8.1。在 jQuery Validation 中有一个名为 remote 的选项,它需要对 Web 服务进行 ajax 调用。我的事情是我正在检查 id 是否已经使用。我正在使用 JSON.stringify 将值发布到 Web 服务,但它会发送空字符串,但如果我在没有 JSON.stringify 的情况下发送,我可以看到该值。

我的代码如下。那么我们该如何解决呢

$(document).ready(function () {
    var validator = $("#form1").validate({
      rules: {
        ctl00$ContentPlaceHolder$txCivilID: {
          required: true,
          rangelength: [12,12],
          digits: true,
          remote: {
            url: "CivilID.aspx/IsAlreadyAvailable",
            type: "post",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: JSON.stringify({ civilID: $('#<%=txCivilID.ClientID%>').val() }),
            dataFilter: function (data) {
              var msg = JSON.parse(data);
              if (msg.hasOwnProperty('d'))
                return msg.d;
              else
                return msg;
            }
          }
        },
        ctl00$ContentPlaceHolder$txFirstName: {
          required: true
        },
        ctl00$ContentPlaceHolder$txLastName: {
          required: true
        },
        ctl00$ContentPlaceHolder$txMobile: {
          required: true,
          rangelength: [8,8],
          digits: true
        },
        ctl00$ContentPlaceHolder$dpUserType: {
          required: true
        }
      },
      messages: {
        ctl00$ContentPlaceHolder$txCivilID: {
          required: "Civil for is required!",
          rangelength: "Civil for should be {0} in length!",
          digits: "Civil for should be only numbers!",
          remote: "Civil ID already exists !!!"
        },
        ctl00$ContentPlaceHolder$txFirstName: "First Name is required!",
        ctl00$ContentPlaceHolder$txLastName: "Last Name is required!",
        ctl00$ContentPlaceHolder$txMobile: {
          required: "Mobile number is required!",
          rangelength: "Mobile number should be {0} in length!",
          digits: "Mobile number should be only numbers!"
        },
        ctl00$ContentPlaceHolder$dpUserType: "Select User Type !"
      },
      errorPlacement: function (error, element) {
        $('label[for="' + element.attr("id") + '"]').text(error.text());
      }
    });
  });   

Javascript 的渲染版本

<script type="text/javascript">
$(document).ready(function () {
    var validator = $("#form1").validate({
      rules: {
        ctl00$ContentPlaceHolder$txCivilID: {
          required: true,
          rangelength: [12,12],
          digits: true,
          remote: {
            url: "CivilID.aspx/IsAlreadyAvailable",
            type: "post",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: '{ civilID:' + JSON.stringify($('#ContentPlaceHolder_txCivilID').val()) + '}',
            dataFilter: function (data) {
              var msg = JSON.parse(data);
              if (msg.hasOwnProperty('d'))
                return msg.d;
              else
                return msg;
            }
          }
        },
        ctl00$ContentPlaceHolder$txFirstName: {
          required: true
        },
        ctl00$ContentPlaceHolder$txLastName: {
          required: true
        },
        ctl00$ContentPlaceHolder$txMobile: {
          required: true,
          rangelength: [8,8],
          digits: true
        },
        ctl00$ContentPlaceHolder$dpUserType: {
          required: true
        }
      },
      messages: {
        ctl00$ContentPlaceHolder$txCivilID: {
          required: "Civil for is required!",
          rangelength: "Civil for should be {0} in length!",
          digits: "Civil for should be only numbers!",
          remote: "Civil ID already exists !!!"
        },
        ctl00$ContentPlaceHolder$txFirstName: "First Name is required!",
        ctl00$ContentPlaceHolder$txLastName: "Last Name is required!",
        ctl00$ContentPlaceHolder$txMobile: {
          required: "Mobile number is required!",
          rangelength: "Mobile number should be {0} in length!",
          digits: "Mobile number should be only numbers!"
        },
        ctl00$ContentPlaceHolder$dpUserType: "Select User Type !"
      },
      errorPlacement: function (error, element) {
        $('label[for="' + element.attr("id") + '"]').text(error.text());
      }
    });
  });     

【问题讨论】:

    标签: jquery asp.net web-services jquery-validation-engine


    【解决方案1】:

    那里不需要JSON.stringify() 方法。因为它已经是一个字符串。 JSON.stringify() 是将一个 json 对象转换为字符串。像这样更改代码

    data: { civilID: $('#<%=txCivilID.ClientID%>').val() },
    

    【讨论】:

    • 我试过了,但在我的萤火虫帖子中我可以看到这样的 ctl00%24ContentPlaceHolder%24txCivilID=123456789012&civilID= 我可以看到civilID是空白的,响应就像这样 {"Message":"Invalid JSON primitive : ctl00.","StackTrace":" 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度)\r\n 在 System .Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串输入,Int32 depthLimit,JavaScriptSerializer 序列化程序)\r\n at
    • 我在原帖中添加了渲染版本的代码
    • 好吧,我把它改成数据:"{'civilID':'" + $('#').val() + "'}", 现在我的 ajax 调用没有给出错误,但它仍然在发送空白字符串
    • 它的母版页似乎有问题。我会删除它,稍后再看
    【解决方案2】:

    尝试更改此行:

     data: JSON.stringify({ civilID: $('#<%=txCivilID.ClientID%>').val() }),
    

    到这个...

     data: JSON.stringify('{ civilID:' + $('#<%=txCivilID.ClientID%>').val() + '}'),
    

    由于这不起作用,您是否考虑过将数据位卸载到函数:

    function getCivilIdData() {
      var data = {};
      data['civilId'] = $('#<%=txCivilID.ClientID%>').val();
      return data;
    }
    

    然后将您的另一行更改为:

     data: JSON.stringify(getCivilIdData()),
    

    【讨论】:

    • 我试过了,但在我的萤火虫帖子中我可以看到这样的 ctl00%24ContentPlaceHolder%24txCivilID=123456789012&civilID= 我可以看到civilID是空白的,响应就像这样 {"Message":"Invalid JSON primitive : ctl00.","StackTrace":" 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n 在
    • 我已经更新了我的答案以尝试不同的方式。
    • 您是否有机会从“查看源代码”发布“渲染”版本的 javascript,这可能会为此事带来更多启示?
    【解决方案3】:

    这是我的错误,实际上遥控器应该用作下面的函数

     remote: function(){
     }
    

    上面解决了 JSON.strigify 发送空白字符串的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2018-07-26
      • 2021-10-18
      • 1970-01-01
      • 2021-01-31
      • 2020-11-29
      • 2019-12-28
      相关资源
      最近更新 更多