从 javascript 到控制器的数据传递错误

Data passing error from javascript to controller

我正在研究 ASP.NET MVC 项目,我想获取位置下拉列表的选定值,根据我需要将值加载到城市下拉列表,我实现了以下代码和位置下拉列表 onselect 事件调用javascript 函数和 javascript 函数调用控制器方法但是当执行控制器方法时 locationId 为空,我调试 javascript 并且 locationID 一直存在直到这一行 data: JSON.stringify({ locationId: +locationId }),之后javascript returns error.but 控制器方法被命中但 locationId 为空

下拉菜单代码

  <div class="row">
    <div class="col-sm-4">
        @Localizer["Locations"]
        <select id="locationDropDown"  class="selectpicker form-control" asp-for="selectedLocation" onchange="getCityList()">
            <option value="0">&lt;None&gt;</option>
            @foreach (var item in Model.LocationList)
            {
                <option value="@item.Id">@item.Name</option>
            }
        </select>
    </div>
</div>
<div class="row">
    <div class="col-sm-4">
        @Localizer["KioskGroup"]
        <select id="cityDropDown" class="selectpicker form-control">
            <option>---Select City---</option>
        </select>
    </div>
</div>

Javascript代码

function getCityList()
        {
        debugger;
            var locationId = $("#locationDropDown").val();
            console.log(locationId)
        $.ajax({
            url: '/Kiosk/GetZoneListBYlocationID',
            type: 'POST',
            datatype: 'application/json',
            contentType: 'application/json',
            data: JSON.stringify({ locationId: +locationId }),
            success: function (result) {
                $("#cityDropDown").html("");
                $("#cityDropDown").append
                ($('<option></option>').val(null).html("---Select City---"));
                $.each($.parseJSON(result), function (i, zone) 
                { $("#cityDropDown").append($('<option></option>').val(zone.Id).html(zone.Name)) })

            },
            error: function(){alert("Whooaaa! Something went wrong..")},
        });

控制器方法

  public ActionResult GetZoneListBYlocationID(string locationID)
        {
            List<Zone> lstZone = new List<Zone>();
            long locationId = long.Parse(locationID);

            var zones = _zoneRepository.GetZonesByLocationId(locationId);

            return Json(JsonConvert.SerializeObject(zones));
        }

我遇到了同样的问题。之后,我尝试了以下解决方案。 希望对你有所帮助。

ajax调用如下:

          $.ajax({
                type: 'POST',
                url: "/Account/GetCities",
                dataType: 'json',
                data: { id: $("#StateID").val() },
                success: function (states) {
                    $.each(states, function (i, state) {
                       $("#CityID").append('<option value="' + state.Value + '">' + state.Text + '</option>');
                    });
                },
                error: function (ex) {
                    alert('Failed to retrieve cities.' + ex);
                }
            });

控制器代码如下:

public List<CityModel> GetCities(int id)
{
        //your code
}

您可以在您的应用程序中这样做:

function getCityList()
        {

            var locationId = $("#locationDropDown").val();
            console.log(locationId)
        $.ajax({
            url: '/Kiosk/GetZoneListBYlocationID',
            type: 'POST',
            dataType: 'json',
            data: { locationId: locationId },
            success: function (result) {
                $("#cityDropDown").html("");
                $("#cityDropDown").append
                ($('<option></option>').val(null).html("---Select City---"));
                $.each($.parseJSON(result), function (i, zone) 
                { $("#cityDropDown").append($('<option></option>').val(zone.Id).html(zone.Name)) })

            },
            error: function(){alert("Whooaaa! Something went wrong..")},
        });
}

并且您的控制器将与您所做的相同。

为什么你是 stringify data.Below 应该没有 stringify

data: { locationId: +locationId },

您当前的代码正在 请求 body 中发送 json 字符串 {"locationId":101} 因为您将 contentType 指定为 application/json.当您想要发送具有多个属性的 object 并且您的操作方法参数是 DTO/POCO class 类型时,这很有用。模型绑定器将从请求中读取 body 并将其映射到参数。

在您的情况下,您发送的只是一个值。所以不要发送 JSON 字符串。只需创建一个 js object 并将其用作 data 属性值。还要删除 contentType: application/json,因为我们不会将复杂的 js object 作为 json 字符串发送。

此外 application/json 不是 dataType 属性 的有效选项。您可以使用 json。但是 jQuery 足够聪明,可以从服务器返回的响应 header 中猜测这里需要的值。所以你可以删除它。

function getCityList() {

    var locationId = $("#locationDropDown").val();
    $.ajax({
        url: '/Kiosk/GetZoneListBYlocationID',
        type: 'POST',
        data: { locationID: locationId },
        success: function (result) {
           console.log(result);
           // populate dropdown
        },
        error: function () { alert("Whooaaa! Something went wrong..") },
    });

}

现在,此数据将作为 locationID=101 以 Content-Type header 值作为 application/x-www-form-urlencoded 在表单数据中发送,并将正确映射到您的操作方法参数。

您应该使用正确的类型。在您的操作方法中,您使用 string 作为参数,稍后尝试将其转换为 long。为什么不使用 long 作为参数类型?此外,如果 zones 变量是 Zone object 的列表,您可以将其直接传递给 Json 方法。无需在两者之间创建 string 版本。

 public ActionResult GetZoneListBYlocationID(long locationId)
 {
    var zones = _zoneRepository.GetZonesByLocationId(locationId);
    return Json(zones);
 }