Html.Hidden值从View丢失到Controller

时间:2017-03-04 16:41:19

标签: jquery ajax asp.net-mvc razor

我需要将一个来自ajax结果的值添加到表单已经传递给控制器​​的其他参数中。 除了这个参数形式和控制器完全按预期工作。

这是控制器

[HttpGet]
public async Task<ActionResult> Search(int? page, int? selectedCategoryID, int[] geoDataID = null, string searchString = "", string sortBy = "")

导致问题的参数是&#39; int [] geoDataID&#39;。 为了将它从ajax.result传递给控制器​​,正在使用隐藏字段。此外,由于此值必须随后传递到另一个视图,因此我使用ViewBag将其值从控制器传回。 这里有以下形式:Html.Action和输入用于填充其他DDL并将其他参数传递给控制器​​。所有这些都工作正常。

@using (Html.BeginForm("Search", "Home", FormMethod.Get, new { @class = "navbar-form navbar-left" }))
            {
                @Html.Action("GetCategoryList", "Categories")
                <div class="form-group">
                    <input id="searchString" name="searchString" type="text" class="form-control" placeholder="search string" onfocus="this.value=''" />
                </div>
                @Html.Action("GetRangeIput", "GeoData")
                @Html.Hidden("geoDataID", (object)ViewBag.geoDataID, new { id = "geoDataID" })
                <button type="submit" class="btn btn-default">Search</button>
            }

将ajax结果传递给

(这可能就是这个想法)
@Html.Hidden("geoDataID", (object)ViewBag.geoDataID, new { id = "geoDataID" })

jquery.ajax也没什么特别的

$('#selectedRangeID').change(function () {
            var rangeSelected = $(this).val();
            $.ajax({
                url: '@Url.Action("getGeoDataInRangeID", "Manage")',
                datatype: "json",
                type: "GET",
                data: {
                    range: rangeSelected * 5000,
                    latitude: LATITUDE,
                    longitude: LONGITUDE
                },
                success: function (data) {
                    $('#geoDataID').val(data);
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert('Failed to retrieve range geodata.');
                }
            });
        })

并且`按预期工作:当我提醒结果时,我可以看到数据值,当我查看生成的html输出时,隐藏字段已经填充了数据。 从

<input id="geoDataID" name="geoDataID" type="hidden" value="" />

,作为一个例子

<input class="input-validation-error" id="geoDataID" name="geoDataID" type="hidden" value="3440,3442,3444,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3468,3469,3470,3473,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3577,3579,3592,3593,3610,3616,3617" />

事实上,除了这个参数之外,所有参数都会在表单提交时进入控制器,而我无法弄清楚缺少什么。

1 个答案:

答案 0 :(得分:2)

此错误可能是因为您的函数需要一个int数组并改为使用逗号分隔的字符串。

尝试使用

[HttpGet]
public async Task<ActionResult> Search(int? page, int? selectedCategoryID, string geoDataID = null, string searchString = "", string sortBy = "")

然后将逗号分隔的字符串转换为字符串数组,如下所示:

var strGeoDataId = geoDataID.split(',');

然后int解析它们中的每一个以将其转换为整数数组。

var intGeoDataId = Array.ConvertAll(strGeoDataId, int.Parse);

希望这有帮助!