【问题标题】:How to pass array from Javascript to controller's action?如何将数组从 Javascript 传递给控制器​​的动作?
【发布时间】:2020-10-20 10:55:59
【问题描述】:

我在.cshtml 视图的@section Scripts 中有这样的JS 函数:

function SendIndexes() {
                    var selectedSortOption = $("#SortBy").find('option:selected');
                    var sortIndex = selectedSortOption.val();

                    var selectedFilterByTypeOption = $("#filter_marker_bytype").find('option:selected');
                    var filterByTypeIndex = selectedFilterByTypeOption.val();

                    var selectedFilterByScoreOption = $("#filter_marker_byscore").find('option:selected');
                    var filterByScoreIndex = selectedFilterByScoreOption.val();
                    

                    var selectedFilterByStatusOption = $("#filter_marker_bystatus").find('option:selected');
                    var filterByStatusIndex = selectedFilterByStatusOption.val();

                    var markerFilterIndexes = [filterByTypeIndex, filterByScoreIndex, filterByStatusIndex];


                    location.href = `/Markers/MarkersList?page=@Model.PagingInfo.CurrentPage&sortIndex=${sortIndex}&markerFilterIndexes=${markerFilterIndexes}`
                }

控制器动作签名如下:

public async Task<IActionResult> MarkersList(List<string> markersForUpdateIds, IEnumerable<int> markerFilterIndexes, int page = 1, string message = "", int sortIndex = 0)
{
...
}

问题是三个元素的数组根本没有传入。但是,如果我只将一个变量(元素)推送到这个数组,那么它会按原样传递给控制器​​的操作。

为什么会发生这种情况以及如何将所有三个元素都传递给控制器​​?

【问题讨论】:

标签: javascript asp.net-core razor


【解决方案1】:

我建议您在参数中使用[FromQuery] 属性,并像这样格式化您的网址:myparam=myvalue1&amp;myparam=value2&amp;myparam=myvalue3

public async Task<IActionResult> MarkersList([FromQuery]List<string> markersForUpdateIds, [FromQuery]IEnumerable<int> markerFilterIndexes, [FromQuery]int page = 1,[FromQuery] [FromQuery]string message = "", [FromQuery]int sortIndex = 0)
{
...
}

看看ModelBinding: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-3.1#sources

【讨论】:

    【解决方案2】:

    用于将数组传递给控制器​​动作。使用下标数字 (... [0] ... [1] ...) 的数据格式必须确保它们从零开始按顺序编号。在这里你不需要定义一个数组,只需像这样格式化你的 url:

    location.href = `/Markers/MarkersList?page=@Model.PagingInfo.CurrentPage&sortIndex=${sortIndex}&markerFilterIndexes[0]=${filterByTypeIndex}&markerFilterIndexes[1]=${filterByScoreIndex}&markerFilterIndexes[2]=${filterByStatusIndex}`
    

    由于数组中的数据只是int类型的数据,所以可以省略下标数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-27
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2021-09-24
      • 2019-08-12
      相关资源
      最近更新 更多