从一个文本框上的keydown调用AJAX来填充另一个文本框ASP.NET MVC

时间:2016-10-20 14:50:33

标签: c# jquery json ajax asp.net-mvc

我正在尝试从单独的文本框中的值填充文本框,即。使用客户帐号自动填充客户名称。我的AJAX正在返回正确的结果,但它没有填充到其他文本框中,这就是为什么我怀疑我的jQuery是错误的。

<div class="form-group">
    @Html.LabelFor(model => model.AccountNumber, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.TextBoxFor(model => model.AccountNumber, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.AccountNumber, "", new { @class = "text-danger" })
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(model => model.CustomerName, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.TextBoxFor(model => model.CustomerName, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.CustomerName, "", new { @class = "text-danger" })
    </div>
</div>
[HttpGet]
public ActionResult GetCustomerName(string RecKey)
{
    var result = (from c in db.Customers
                    where c.RecKey.Equals(RecKey)
                    select new { c.RecName });
    return Json(result, JsonRequestBehavior.AllowGet);
}

返回JSON(仅返回一个完全匹配的结果):

[{"RecName":"This is a customer name"}]
$(document).ready(function () {
    var RecKey;
    $(function () {
        $("#AccountNumber").keydown(function () {
            RecKey = $("#AccountNumber").val();
            $.ajax({
                type: "GET",
                url: 'GetCustomerName',
                data: { RecKey: RecKey },
                success: function (data) {
                    if (data) {
                        //alert(data);
                        $('#CustomerName').val(data.RecName);
                    }
                }
            });
        });
    });
});

我对jQuery很陌生,并且在同一个文本框上已经成功使用自动完成功能,但我的搜索并没有找到很多填充其他文本框的内容。有人有什么想法吗?

2 个答案:

答案 0 :(得分:1)

问题是因为生成的JSON是一个对象数组。如果您可以保证它只返回该数组中的单个对象,那么您可以对该数组的索引访问器进行硬编码:

success: function (data) {
  if (data) {
    $('#CustomerName').val(data[0].RecName);
  }
}

或者,您可以修改C#代码以返回单个实体而不是数组:

return Json(result.SingleOrDefault(), JsonRequestBehavior.AllowGet); // or FirstOrDefault()

答案 1 :(得分:0)

我认为TextBox助手只添加了name属性,而你的JQuery代码正在按ID查找框.... 尝试改变;

@Html.TextBoxFor(model => model.CustomerName, new { @class = "form-control" })

@Html.TextBoxFor(model => model.CustomerName, new { @class = "form-control", id = "CustomerName" })

您还需要使用其他答案中建议的SingleOrDefault服务器端或[0]索引器客户端 - 因为即使数组只有一个项目,它仍然是一个数组(不是对象),所以也需要修复。

P.S。调试这样的东西的一个有用的工具是按F12来启动开发人员控制台 - 然后你可以尝试输入你的jquery代码,看看它是否可以直接进入控制台。例如,如果您键入$(&#34; #CustomName&#34;),您实际上是否返回了一个对象?如果没有 - 那么我的回答就是原因。如果是这样 - 其他东西正在影响这一点。