为什么我传入 JQuery Autocomplete 的第二个参数的值始终为零?

Why is the value of second parameter I'm passing in JQuery Autocomplete always zero?

我正在尝试将一个附加参数传递到我的控制器中。一切正常,只是我似乎无法获取第二个参数的值。

我的控制器需要以下两个参数:

public JsonResult GetProductList(string term, int manufacturerid)

我的自动完成编码如下:

 $("#InternalProductNumber").catcomplete({
   delay: 0,
   min_length: 3,
   source: '@Url.Action("GetProductList", "Proposal")',
   data: {
      term: $("#InternalProductNumber").val(),
      manufacturerid: $("#ManufacturerId").val()
    }, 
     select: function (event, ui) {
        $("#ProductId").val(ui.item.value);
        $("#InternalProductNumber").val(ui.item.label);
        $("#SellPrice").val(ui.item.sellprice);
        return false;
      }
   });

Term 始终正确传递,但 manufacturerid(它是一个下拉列表)始终为零。如果我在 select 函数中放置一个警报,我会得到一个非零结果,告诉我我有一个值。

alert($("#ManufacturerId").val());

******* 编辑 *******

我按照建议添加了代码,现在看起来如下:

 $("#InternalProductNumber").catcomplete({
            delay: 0,
            min_length: 3,
            source: '@Url.Action("GetProductList", "Proposal")'+ `?manufacturerid=${$("#ManufacturerId").val()}`,
            select: function (event, ui) {
                alert('@Url.Action("GetProductList", "Proposal")' + `?manufacturerid=${$("#ManufacturerId").val()}`);
                $("#ProductId").val(ui.item.value);
                $("#InternalProductNumber").val(ui.item.label);
                $("#SellPrice").val(ui.item.sellprice);
                return false;
            }
        });

我得到的 manufacturerid 参数仍然为 0。这是开发人员选项中“网络”选项卡的结果。

我在 selection 之后添加了警报只是为了仔细检查,我在警报中得到了正确的结果。

不确定从这里去哪里。我做错了什么?

谢谢。

-- 瓦尔

您看到 term 是来自文本框 InternalProductNumber 的 jQuery 内置参数。 term 将始终出现在您的方法 public JsonResult GetProductList(string term, int manufacturerid).

我能够在 ASP.NET 核心项目中重现您的代码并得到相同的结果 manufacturerid = 0。我的代码略有不同:

$("#InternalProductNumber").autocomplete({
           minLength: 3,
           source: '@Url.Action("GetProductList", "Home")',
           data: {
               term: $("#InternalProductNumber").val(),
               manufacturerid: $("#ManufacturerId").val()
           },
           select: function (event, ui) {
                console.log("In select function.");
                return false;
           }
       });

我进行了调试,在 Watch window 中我可以看到 Request.QueryString = '?term=aaa' 而没有 manufacturerid

解决方案

$("#InternalProductNumber").catcomplete({
    delay: 0,
    min_length: 3,
    source: '@Url.Action("GetProductList", "Proposal")'+ `?manufacturerid=${$("#ManufacturerId").val()}`,
    select: function (event, ui) {
        $("#ProductId").val(ui.item.value);
        $("#InternalProductNumber").val(ui.item.label);
        $("#SellPrice").val(ui.item.sellprice);
        return false;
    }
  });

function ManufacturerId_OnChange() {
    $("#InternalProductNumber").catcomplete('option', 'source', '@Url.Action("GetProductList", "Home")' + `?manufacturerid=${$("#ManufacturerId").val()}`);
}

在我添加 manufacturerid 作为 QueryString 参数后,函数 GetProductList 正确地得到 termmanufacturerid.

更新

About.cshtml

@{
    ViewData["Title"] = "About";
    Layout = null;
}
<html>
<body>
<h2>@ViewData["Title"]</h2>
<h3>@ViewData["Message"]</h3>

<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>

<p>Use this area to provide additional information.</p>

<input type="text" id="InternalProductNumber" name="InternalProductNumber" />

<br />
<select id="ManufacturerId" name="ManufacturerId"  onchange="ManufacturerId_OnChange();">
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
    <option value="4">Four</option>
</select>

<script type="text/javascript">
    console.log(`In 1 ${parseInt($('#ManufacturerId').val())}.`);

    //catcomplete
    
    $("#InternalProductNumber").autocomplete({
       minLength: 3,
       source: '@Url.Action("GetProductList", "Home")' + `?manufacturerid=${$("#ManufacturerId").val()}`,
       select: function (event, ui) {
            console.log("In select function.");
            return false;
       }
   });
   function ManufacturerId_OnChange() {
        //catcomplete
        $("#InternalProductNumber").autocomplete('option', 'source', '@Url.Action("GetProductList", "Home")' + `?manufacturerid=${$("#ManufacturerId").val()}`);
    }
</script>

HomeController.cs

public class HomeController : Controller
{
    [HttpGet]
    public JsonResult GetProductList(string term, int manufacturerid)
    {
        var strTestJSON = "{ \"test\": 1, \"cat\": 2}";

        return Json(JsonConvert.DeserializeObject(strTestJSON));
    }
}