【问题标题】:Passing a Var and List to Controller via Ajax通过 Ajax 将 Var 和 List 传递给控制器
【发布时间】:2014-02-10 13:27:37
【问题描述】:

我有一个文本框和一个 Select Options Multiple,我在 viewModel 中使用剔除 selectedOptions 存储所有选定的项目。

如果我尝试使用 ajax 将捕获的信息传递给我的控制器,我将无法收到我的 MetricsChosenModel。

            var MetricsChosenModel= window.vm.MetricsChosenModel();
            var ApplicationsNameValue = $.trim($("#add-Applications").val());
            if (ApplicationsNameValue.length <= 0) {
                $("#text-add-Applications").popover('show');
            }
                $.ajax({
                    url: '/Admin/AddApplications',
                    type: "POST",
                    dataType: "JSON",
                    data: { ApplicationsName: ApplicationsNameValue, MetricsChosenModel: MetricsChosenModel },
                    success: function (returndata) {
                        if (returndata == true) {
                        }
                        else {

                        }
                    },
                    error: function () {
                    }
                });

我的控制器

    public ActionResult AddApplications(string ApplicationsName,List<string> MetricsChosenModel)
    {

        //Code here
        return View();
    }

My MetricsChosenModel 以以下格式存储数据 MetricsChosenModel[0] => 5 MetricsChosenModel [1] => 6

为什么我无法收到 MetricsChosenModel 的列表值,但我可以收到 ApplicationsName,

如果有人能解释一下,我怎么错了,那就太好了,

谢谢,

【问题讨论】:

    标签: c# javascript jquery ajax knockout.js


    【解决方案1】:

    在不知道您的路由是什么样子的情况下,很难确定问题的确切根源。如果我不得不猜测,我会说您通过 URL(路由或查询字符串参数)获取 ApplicationsName 值。如果是这种情况,您可以将[FromBody] 属性添加到MetricsChosenModel。但是请注意,每个方法签名只允许您使用一个FromBodyAttribute。如果您需要更多变量,解决此问题的一个简单方法是创建一个模型,其中包含您希望在控制器操作中接收的每个属性。

    希望有帮助!

    【讨论】:

    • 将问题编辑得更准确,我从文本框中获取 ApplicationsName,并将“选择多个组合框”信息存储在 MetricsChosenModel 中。我的问题是为什么我不能将简单的字符串变量ApplicationsName 和列表MetricsChosenModel 传递给我的控制器。我能够收到字符串变量ApplicationsName,但不是列表
    • 我的答案保持不变:将[FromBody] 添加到所需操作方法中的MetricsChosenModel 参数中。因为ApplicationsName 参数的类型是原始类型(字符串),所以框架能够通过URL 将值作为路由值或作为查询字符串参数传递。但是,我不相信它会尝试将列表值推送到查询字符串中。因此,您需要从请求正文中读取该值。您可以通过运行 Fiddler 来查看发布的请求来测试我的理论。
    【解决方案2】:

    我自己在使用 ASP.NET MVC 时遇到了这个问题:将带有一些字段和一个或多个数组的模型发送到控制器不会正确地将数组内容放入 C# 模型中。对 ajax 调用的以下更改每次都会为我修复它:

                $.ajax({
                    url: '/Admin/AddApplications',
                    type: "POST",
                    contentType: 'application/json; charset=utf-8', // ADD THIS
                    dataType: "JSON",
                    data: JSON.stringify({ ApplicationsName: ApplicationsNameValue, MetricsChosenModel: MetricsChosenModel }), // Also added JSON.stringify
                    success: function (returndata) {
                        if (returndata == true) {
                        }
                        else {
    
                        }
                    },
                    error: function () {
                    }
                });
    

    'content-type' 和 'JSON.stringify' 帮助 MVC 转换模型。如果这对你也有帮助,请告诉我:)

    【讨论】:

    • 嗨,伙计,感谢您的回复,我已经知道这个字符串化了。但你不认为这是一个开销吗?首先要字符串化并在控制器中解码?假设列表中有 100 个项目。当我们可以在 ajax 调用中接收到一个简单的字符串时,为什么不是一个列表是我的全部问题。
    • 根据我的经验,开销可以忽略不计。在我们的应用程序中,我们以这种方式通过线路发送数千个(如果不是更多)相当复杂的对象的数组,没有问题。我不知道为什么没有它 ASP.NET 无法正确处理数组的细节,因为我主要关心前端,它与它使用的模型绑定逻辑有关。如果您不想进行字符串化,我认为您最好的选择是连接到模型绑定器,看看它做了什么,以及是否可以通过覆盖该逻辑来修复它。我们已经尝试过了,但从未完全正确。
    • 从技术上讲,无论您选择哪种传输格式,框架都必须解码和执行模型绑定。通过省略content-type=application-json,您暗示了multipart/form-data 的内容类型。如果您从网络堆栈中排除了 json2.js 库,则唯一真正可能引起明显的、可能无根据的开销。即便如此,可能不值得将 JSON 作为格式选项消除。也就是说,我仍然认为[FromBody] 会解决你的问题;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多