【问题标题】:MVC 5 Ajax POST - action variable not recognizing ajax data variableMVC 5 Ajax POST - 动作变量无法识别 ajax 数据变量
【发布时间】:2014-03-19 13:18:01
【问题描述】:

我有一个从网格中抓取行的点击功能。返回值是代表每一行的对象列表。我使用 JSON.stringify,所以我可以将数据发送到我的 Home Controller 上的 SaveJobs 操作。以下属性有效,并且我的控制器操作可以识别数据,但它不是有效的 JSON 格式。

contentType: 'application/json; charset=utf-8'
data: { data: JSON.stringify(editedRows) }

但是,我通过研究发现以下方法是首选,因为它是有效的 JSON 格式,但我的控制器操作上的数据变量为空(不返回任何数据来执行我的操作)并且我无法调试问题.为什么动作变量无法识别这一点?谢谢。

$('#SaveJobs').on('click', function () {

editedRows = getEditedRows();

$.ajax({
    type: 'POST',
    contentType: 'application/json; charset=utf-8', 
    url: savePlannedJobsUrl,
    cache: false,
    data: JSON.stringify({ data: editedRows }),
    dataType: "text",
    success: function (result) {

        if (result === 'Success') {
            alert('The records you have edited are saved');
        }
        else {
            alert('There was an error with the server. All records may not have been saved.');
        }

        $("*").css("cursor", "");
    },
    error: function (HtmlHttpRequest, ajaxOptions, thrownError) {
        var htmlObj = $.parseHTML(HtmlHttpRequest.responseText);
        var savedJson = JSON.stringify(editedRows);

        if (htmlObj !== null) {
            var htmlBody = htmlObj[htmlObj.length-1].outerText;;
        }

        tryToWriteError(htmlBody, savedJson);
    }
  });
return false;
});

控制器

[HttpPost]
public string SaveJobs(string data)
{
    // CODE HERE
}

回答: 我标记了@Queti 的答案,更具体到我的问题,请参阅我评论中的链接,这将有助于 MVC 项目。该解决方案将跳过创建 DTO。

【问题讨论】:

  • 您需要查看客户端实际发送到服务器的内容。使用浏览器的开发者工具或 Fiddler。
  • 第一种方法,有效但不是有效的 JSON,发送data=%5B%7B%22id%22%3A7191....(more data here),第二种方法无效,但有效的 JSON,发送{"data":[{"id":5207,"Comments"...(more code)}]}

标签: ajax asp.net-mvc json


【解决方案1】:

问题是您正在发送一个对象数组,但您的操作方法需要一个字符串。

您的 getEditedRows 方法似乎正在返回一个对象数组。

我建议您在服务器上创建一个与您传入的内容相匹配的模型。类似于:

public class MyDto
{
  int id { get; set; }
  string comments { get; set; }
}

然后更新您的方法签名以接受它作为参数:

public string SaveJobs(List<MyDto> data)

【讨论】:

  • 可以发回多少个对象有限制吗?另外,contentType 会是默认值吗?
  • 是的,有一个限制,但是可以配置:stackoverflow.com/questions/15788342/…
  • hmm..如果您不介意,还有两个项目。数据会从 AJAX 调用自动映射到我的 DTO 吗?我现在正在测试它,我所有的属性都是空的。所以<jsonSerialization maxJsonLength="50000000"/> 在我发送对象时有效吗?如果是这样,是否限制了对象的数量?
  • 对于映射问题我找到了解决方案here
猜你喜欢
  • 2021-07-27
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多