【问题标题】:Posting JSON string to ASP.NET MVC 3 action results in null parameter将 JSON 字符串发布到 ASP.NET MVC 3 操作会导致空参数
【发布时间】:2012-09-18 20:54:18
【问题描述】:

我正在向 asp.net MVC 发布一个 JSON 字符串,如下所示。

AJAX 调用

$.ajax({
            type: "POST",
            url: "@(storeLocation)IDR/OpcInsertCustomerProfile/",
            data: JSON.stringify(currSelection),
            contentType: "application/json",
            success: function(data) {
              alert('success : ' + JSON.stringify(data));
            },
            error: function(data) {
             alert('Error : ' + JSON.stringify(data));
            }
          }
        );

在控制器中:

[HttpPost]
        [ActionName("OpcInsertCustomerProfile")]
        public JsonResult OpcInsertCustomerProfile(string currSelectionData)
        {
            try
            {
                JavaScriptSerializer ser = new JavaScriptSerializer();
                var res = ser.Serialize(currSelectionData);
                return Json(currSelectionData, JsonRequestBehavior.AllowGet);

            }
            catch (Exception exc)
            {
                return Json(new { error = 1, message = exc.Message });
            }
        }

调试器表示动作被成功调用,但是接收到的传入字符串参数始终为空。 Firebug 'post' 显示传出参数是正确的 json 对象。我期待看到 JSON 字符串作为传入参数。请注意,我不想将其反序列化为适当的对象。我要做的就是将字符串以 JSON 格式“原样”存储在数据库中。稍后需要将其检索并按原样传递给 Javascript。

【问题讨论】:

  • 好吧,看起来 asp.net MVC 自动将传入的 JSON 对象映射到单个对象。这很有趣,但我需要将整个 json 对象捕获为 SINGLE STANDALONE STRING。我该怎么做?

标签: javascript asp.net json asp.net-mvc-3


【解决方案1】:

试试这个:

$.ajax({
            type: "POST",
            url: "@(storeLocation)IDR/OpcInsertCustomerProfile/",
            data: { "currSelectionData" : "'" + JSON.stringify(currSelection) + "'" },
            contentType: "application/json",
            success: function(data) {
              alert('success : ' + JSON.stringify(data));
            },
            error: function(data) {
             alert('Error : ' + JSON.stringify(data));
            }
          }
        );

【讨论】:

  • 执行上述操作会导致以下错误 500 内部服务器错误 JSON 原语无效:currSelectionData。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息:System.ArgumentException:无效的 JSON 原语:currSelectionData。
  • 然后试着让它像这样: data: { "currSelectionData" : "'" + JSON.stringify(currSelection) + "'" } 更多信息请看stackoverflow.com/questions/2445874
  • 数据:{ currSelectionData: JSON.stringify(currSelection)}
【解决方案2】:

一种方法是允许操作以 POST 数据而不是 JSON“字符串化”数据的形式接收参数。为此,请在不使用 JSON.Stringify 的情况下发布数据。希望这是您所需要的。

如果不是,您可能想尝试创建一个对象来接收这些简单的数据。

【讨论】:

    【解决方案3】:

    查看您的操作方法:该方法接受带有序列化 JSON 的字符串,而不是再次将该字符串序列化为 JSON 然后关闭结果并序列化并再次返回相同的字符串是否正确?

    如果您使用 application/json 类型发送请求,ASP.NET MVC 会尝试反序列化接收到的字符串并将其绑定到操作参数:在您的情况下,它会尝试在您的 JSON 对象 inside 中查找属性 currSelectionData。那个属性存在吗?也许您希望整个字符串作为currSelectionData 参数接收?然后你需要使用 FormCollection 或 Request.Form 代替,因为默认的模型绑定器不支持这个。

    【讨论】:

    • -你是对的!我希望将整个字符串作为参数接收。此外,我不希望传入字符串和现有对象之间有任何映射。整个传入字符串需要保存在数据库中(JSON 格式)。您能否进一步指导您建议的替代方案。
    【解决方案4】:

    实际上,我在选择国家时用 json 填充我的状态下拉列表,我确实喜欢这样

    在我的控制器中,我有动作,它以 json 格式返回我的数据,如下所示

    public JsonResult State(int countryId)
            {               
                var stateList = CityRepository.GetList(countryId);
                return Json(stateList, JsonRequestBehavior.AllowGet);
            } 
    

    在我看来

    <script type="text/javascript">
        function cascadingdropdown() {
            $("#stateID").empty();
            $("#stateID").append("<option value='0'>--Select State--</option>");
            var countryID = $('#countryID').val();
            $.ajax({
                url: "/City/State",
                dataType: 'json',
                data: { countryId: countryID },
                success: function (data) {
                    $("#stateID").empty();
                    $("#stateID").append("<option value='0'>--Select State--</option>");
                    $.each(data, function (index, optiondata) {
                        alert(optiondata.StateName);
                        $("#stateID").append("<option value='" + optiondata.ID + "'>" + optiondata.StateName + "</option>");
                    });
                },
                error: function () {
                    alert('Faild To Retrieve states.');
                }
    
            });
        } 
    </script>
    

    我认为这会对你有所帮助...

    【讨论】:

      【解决方案5】:

      当通过 Ajax 发送 json 时,我认为这是 Ajax 中 data 属性的正确方法: data: "{'parameterNameInAction':'" + JSON.stringify(jsonData) + "'}"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 2013-01-23
        • 2016-03-14
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多