【问题标题】:How to pass model from view to controller using ajax如何使用ajax将模型从视图传递到控制器
【发布时间】:2018-06-13 07:28:31
【问题描述】:

鉴于我收到了HistorySearch 类型的模型。然后我想使用ajax将此模型重新发送到控制器:

$("#exportCsv").click(function () {
    // get model as json
    var searchData = '@Html.Raw(Json.Encode(@Model))';
    searchData = JSON.stringify({ 'search': searchData });

    $.ajax({
        //contentType: 'application/json; charset=utf-8',
        url: '@Url.Action("ExportToCsv", "BankCosts")',
        type: 'POST',  
        data: searchData,
        dataType: 'json',
        error: function (xhr) {
            alert('Error: ' + xhr.statusText);
        },
        async: true,
    });
});

如您所见,我不得不评论 contentType,因为出于某种原因,此传递的模型在控制器中设置为 null

另外,我的控制器是这样编码的:

[HttpPost]
public void ExportToCsv(HistorySearch search)
{
    // search properties are not filled. They are set to default value
}

事情是绑定没有正常工作。收到的search 属性设置为默认值。怎么了?

【问题讨论】:

  • 您需要将视图内容包装在一个表单中。序列化然后提交。从您的 ajax 调用中删除 dataType 表示法。这是您期望返回的数据类型.. 无效.. 不是 json。保留内容类型。现在默认为 application/x-www-form-urlencoded; charset=UTF-8 这正是你所需要的。
  • 删除 @Html.Raw() 周围的引号 - 但是发送回您刚刚发送到视图的完全相同的模型到底有什么意义
  • 您发回的模型与您发送到视图中的模型完全相同,而不是编辑过的值!
  • 再一次,您将发送回控制器刚刚发送到视图的确切内容 - 这完全没有意义!如果你想发回表单的值,那么它的data: $('form').serialize(),
  • 第二个对象是什么?我们不知道你的模型是什么形式是什么

标签: javascript asp.net ajax asp.net-mvc


【解决方案1】:

JSON.stringify({ 'search': searchData }) 会将您的对象转换为字符串,因此会将字符串而不是对象传递给您的ActionResult。 删除 JSON.stringify 和 ajax 调用更改:

$.ajax({url: '...', ..., data: { searchData }, ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多