【问题标题】:How do I post data to controller model using Ajax when I am sending more than one property in ASP.NET Core?当我在 ASP.NET Core 中发送多个属性时,如何使用 Ajax 将数据发布到控制器模型?
【发布时间】:2020-09-10 09:59:08
【问题描述】:

这是我以前从未遇到过的事情,我正在使用 Ajax 和 jQuery 将表单数据发布到我的控制器操作。我面临的问题是我从表单发送的数据不会自动绑定到控制器中的模型类,我想知道如何实现。

到目前为止,这是我的代码,请注意placeholderElement 是我脚本中其他地方定义的模式。

placeholderElement.on('click', '[data-save="view"]', function (event) {
    event.preventDefault();

    //Form Data
    var form = $(this).parents('.modal').find('form');    
    var dataToSend = form.serialize();

    //Grid Selection
    var getColumns = $("#columnGrid tr.k-state-selected");
    var selectedColumns = [];

    //Iterate over selected grid values and add to array
    $.each(getColumns, function (e) {
        var row = $(this);
        var grid = row.closest(".k-grid").data("kendoGrid");
        var dataItem = grid.dataItem(row);
        selectedColumns.push(dataItem.Id);
    });

    //Post to controller
    console.log(selectedColumns)
    console.log(dataToSend)
    $.post({
        url: "/Position/AddCustomView/",
        data: {
            columns: selectedColumns,
            data: dataToSend
        },
        dataType: 'json',
        contentType: 'application/x-www-form-urlencoded; charset=UTF-8',   
        success: function (data) {                
        }
    });
});

您将从上面的代码中看到,我获取了表单数据并将其序列化以准备发布。我还从启用了选择的 kendoui 网格中获取值。然后我将这两组信息发布到我的控制器:

        data: {
            columns: selectedColumns,
            data: dataToSend
        },

这是我的控制器。收到columns 没有任何问题,但我希望data: dataToSend 绑定到UserView model,但它没有。

public JsonResult AddCustomView(UserView model, string[] columns)
{
   //shortened for brevity.
}

我做错了什么以及如何将dataToSend 绑定到model

【问题讨论】:

标签: jquery ajax asp.net-core kendo-ui


【解决方案1】:

有我在 cmets 部分提到的解决方案,它是如何由 Microsoft 文档指定的。或者您可以通过以下选项更轻松地进行操作,而不是 form.serialize(),最好在通过 ajax.post 发送之前在脚本本身中获取数据。例如,它可以在函数内部完成

function postToController(){
//Post to controller
console.log(selectedColumns)
console.log(dataToSend)
var modelToSend = {
        "nameOfField1":"write here value for field 1",
        "nameOfField2":"write here value for field 2" 
//just as much fields as your model has
    };
 $.post({
    url: "/Position/AddCustomView/",
    data: {//the name of the values you send in post should match with those received in controller
        model: modelToSend,
        columns: selectedColumns
    }, 
    success: function (data) {                
    }
 });
}

【讨论】:

  • 感谢您的解决方案,我之前已经尝试过,但它不起作用。模型参数可能仍然没有获取数据,因为时间到了UserView。已经序列化的表单数据可以这样绑定吗?
  • 我已经修改了代码,请重试。如果它不起作用,请分享 TestView,想看看它有哪些字段
  • 它不起作用。我认为您所提议的和我所拥有的之间的区别在于我正在传递序列化的表单数据。正如这里定义的` var form = $(this).parents('.modal').find('form'); var dataToSend = form.serialize();`.
  • 我明白这一点,因此我说的是给你而不是发送序列化数据,例如在函数中再次获取属性的值(例如来自 html 或来自 dataToSend)并将其与与 TestView 本身的字段名称匹配的字段一起保存在 modelToSend 中。然后用 selectedColumns 发送这个 modelToSend。只要确保你也删除了我上面提到的这个 dataType 和 contentType
  • @Yanayaya 你解决了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
相关资源
最近更新 更多