【问题标题】:Error when passing JSON string to MVC Controller将 JSON 字符串传递给 MVC 控制器时出错
【发布时间】:2015-02-28 11:07:13
【问题描述】:

实际上这是非常简单的情况,但我找不到解决方案:我需要通过 jQuery ajax 将 JSON 字符串传递给我的 MVC 控制器,但控制器总是收到 null。 这是 jQuery:

$("#makebooking").click(function (e) {
            var json;
            if ($("form").valid()) {
                var arr = $("form").serializeArray();
                json = JSON.stringify({ 'command': arr });
            }
            $.ajax({
                url: "@Url.Content("~/Booking/CreateBooking")",
                data: json,
                type: "post",
                cache: false,
                dataType: "json",
                success: function (result) {
                    if (result != null) {
                        window.location = result;
                    } else {
                        $("#modalerror").on("show.bs.modal", function () {
                            var modal = $(this);
                            modal.find("#errormsg").text(result.Error);
                        });
                    }
                },
                error: function (xhr) {
                    var err = eval("(" + xhr.responseText + ")");
                    alert(err.Message);
                }
            });

控制器代码在这里:

        [HttpPost]
        public JsonResult CreateBooking(string command)
        {           
            byte[] stream = HttpServerUtility.UrlTokenDecode(Request.Cookies["psw"].Value);
            byte[] decodedValue = MachineKey.Unprotect(stream, "all");
            var psw = Encoding.UTF8.GetString(decodedValue);
            var a = _br.CreateBooking(User.Identity.Name, psw, command);
            return Json(a);
        }

我希望有人可以重新审视这段代码并提出解决方案。谢谢。

【问题讨论】:

  • 你为什么要发布一个字符串(而不是发布你的模型)?
  • @StephenMuecke,我不确定你的意思。你能解释一下吗?
  • 你方法中的参数是string command?你有一个我假设是基于模型的表单,在这种情况下,你应该使用data: $('form').serialize(), 发回你的模型,方法应该是`public JsonResult CreateBooking(YourModel model)`
  • 是的,基于 ViewModel 的表单。刚才我厌倦了使用模型作为参数但没有成功 - 所有数据都是空的。
  • 我使用字符串的另一个原因 - 我需要处理这些数据,以便将其重新创建为 urlencoded 字符串以调用外部 Web 服务。

标签: jquery json asp.net-mvc asp.net-mvc-controller


【解决方案1】:

你的POST方法的参数是string,但是你回发json

将方法改为

[HttpPost]
public JsonResult CreateBooking(YourModel model)

和脚本

if ($("form").valid()) {
  var json = $('form').serialize(); // serialize the form values to json
  $.ajax({
    url: '@Url.Action("CreateBooking", "CreateBooking")', // recommended
    data: json,
    ....

您的模型将正确绑定在 POST 方法中

【讨论】:

    【解决方案2】:

    我不确定这是否是您的全部问题,但看起来您的 ajax 调用中的 url 的引号有问题。尝试将单引号与双引号混合,例如

    url: "@Url.Content('~/Booking/CreateBooking')"
    

    【讨论】:

    • 肯定不是这个问题的根源。
    • 您是否尝试过使用 chrome 或 firefox 中的检查器来检查对服务器的调用?
    • 是的。我看到 json 数据传递给 ajax 调用,但在 jQuery 和 Controller 之间的某个地方错过了。
    • @hobenkr,这没什么区别(尽管使用url: '@Url.Action("CreateBooking", "Booking")',
    • @stephenmuecke,你是对的。感谢您的更正。安德烈,我不熟悉asp,但是你在inspector 中得到服务器的响应吗?也许是错误消息或其他什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2017-02-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    相关资源
    最近更新 更多