【问题标题】:Duplicate binding JSON result重复绑定 JSON 结果
【发布时间】:2014-06-04 09:57:26
【问题描述】:

我正在尝试将 JSON 结果绑定到动态生成的文本框,它在单个文本框上运行良好,但不适用于动态生成的文本框,它在所有文本框上复制相同的值,我正在分享我到目前为止所做的事情:

查询:

function bindAutoComplete(classname) {
    $("." + classname).autocomplete({
        source: function (request, response) {
            $.ajax({
                url: '/Admin/Ticket/GetPart',
                type: "GET",
                dataType: "json",
                data: { term: request.term },
                success: function (data) {
                    if (data != null) {
                        if (data.length > 0) {
                            response($.map(data, function (item) {
                                return { label: item.PartNumber, value: item.PartNumber };
                            }))
                        }
                        else {
                            response([{ label: 'No results found.' }]);
                        }
                    }
                }
            })
        },
    });

}

function bindData() {
    var errormsg = "";
    var amount = $('.inputs').val();

    $.ajax({
        type: "GET",
        url: '/Admin/Ticket/GetPart',
        data: { 'term': amount },
        dataType: "json",
        success: function (data) {
            if (data != null) {
                if (data.length > 0) {

                    $('.buyingprice').val(data[0].Price);
                }
                else {

                    $('.buyingprice').val('');
                }
            }

        },
        error: function (jqXHR, exception) {
            $('#error').html(jqXHR)
        }
    });
};

// fetch part number
$(document).ready(function () {
    bindAutoComplete('inputs');
    $('.inputs').keyup(bindData)
});

$("#AddMore").click(function () {

    $("#maintable").each(function () {

        var tds = '<tr>';

        jQuery.each($('tr:last td', this), function () {
            tds += '<td>' + $(this).html() + '</td>';
        });
        tds += '</tr>';

        if ($('tbody', this).length > 0) {

            $('tbody', this).append(tds);
            //   bindData();
            bindAutoComplete('inputs');
            $("#delete").fadeIn('200');
        }
        else {
            $(this).append(tds);
            bindAutoComplete('inputs');
            //    bindData();

        }
    });

});

HTML:

 <table id="maintable">
    <thead>
        <tr>
            <th>
                Part No
            </th>
            <th>
                BP
            </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>
                <input class="inputs" type="text" name="abcd" id="PartNumber23" style="width:130px;" />
            </td>
            <td>
                <input class="buyingprice text-box single-line" id="BuyingPrice" name="BuyingPrice" type="text" value="" />
            </td>
        </tr>
    </tbody>
</table>

输出图像

我从所有动态文本框的自动完成中获取结果,并将值分别绑定到动态文本框,但它在所有动态文本框上绑定相同的值。我已经搜索了互联网,但找不到任何解决方案。请指导我,我从 2 天起就被困在这里了

【问题讨论】:

  • 正如@Shaz 建议的那样,您可以使用 POST 导致浏览器缓存 get 请求一段时间。如果您需要使用GET,您可以添加一个动态参数,如'Admin/Ticket/GetPart?date' + (new Date())。浏览器会将每个请求都视为一个新请求。
  • @Nilesh 我已经尝试过该方法,但仍然遇到同样的问题,我想将值绑定到动态生成的文本框,我可以向您展示结果的图像吗?
  • 如果更改方法类型,需要先清除浏览器缓存。点击 ctrl+f5 并使用 f12 网络流量监控工具确保您发送正确的请求并获取正确的数据..
  • @Shaz 我得到了正确的数据,我已经清除了浏览器缓存,它在一个简单的文本框上运行得非常完美,但是当我添加动态文本框时,只有自动完成在动态文本框上运行,但绑定不是处理动态texbox。我已经更新了问题并附上了你可以检查的图像,你可以看到 BP 在 keyup 事件上自动绑定,但它不适用于动态 BP 文本框
  • 你在哪里使用 binddata 来动态创建文本框?

标签: jquery ajax asp.net-mvc json asp.net-mvc-4


【解决方案1】:

有一些潜在的问题。和你一起使用 JavaScript。这个

$('.inputs').keyup(bindData)

仅将 keyup 绑定到创建 DOM 时存在的具有 classname = "input" 的元素。为确保其绑定到动态创建的元素,请使用

$("#maintable").on('keyup', '.inputs', function() {...

bindData(){..,这一行

var amount = $('.inputs').val();

使用 classname = "input" 获取 first 输入的值(不是您可能想要的)。这一行

$('.buyingprice').val(data[0].Price);

将类名 = "buyingprice" 的 all 输入的值设置为 data[0].Price

您需要在要引用当前元素的地方使用$(this)

$("#AddMore").click(function () {...

$("#maintable").each(function () {

似乎毫无意义,因为您似乎只有一张 id = "maintable" 的表,并且

bindAutoComplete('inputs');

正在重新绑定所有输入(包括您已经绑定的输入)。

【讨论】:

  • 感谢您的详细回答,我已按照您的说明进行操作,但现在它不会将任何内容绑定到任何文本框,无论是动态文本框还是简单文本框
  • 不,你不是。我创建了this fiddle 来向您展示它是如何工作的(并简化了您的一些代码 - 请注意使用clone() 来复制一行)
  • 感谢您的帮助,但它只是将行复制并粘贴到具有相同值的新行,我不想要相同的值,我希望基于该行自动完成结果的每一行结果跨度>
  • 你还没有发布你的完整 html,所以我不能给你一个完整的解决方案有两种方法可以解决这个问题 (1) 创建第二个 tbody 元素 (display:none),其中一行包含默认值(空)输入并克隆该行或(2)修改克隆 html 以将所有输入的 value 属性设置为默认值
  • 这是完整的 HTML,但底部有一个 ID 为“AddMore”的按钮,请帮助我,我真的被困在这里 2 天
【解决方案2】:

因为您使用的是“GET”类型,因为 GET 方法会将数据缓存在浏览器中。如果每个请求的数据都是新的,则使用“POST”。

别忘了也用 [HttpPost] 来装饰你的 Controller 方法。

$.ajax({
                url: '/Admin/Ticket/GetPart',
                type: "POST",
                dataType: "json",
                data: { term: request.term },
                success: function (data) {
                    if (data != null) {
                        if (data.length > 0) {
                            response($.map(data, function (item) {
                                return { label: item.PartNumber, value: item.PartNumber };
                            }))
                        }
                        else {
                            response([{ label: 'No results found.' }]);
                        }
                    }
                }
            })

【讨论】:

  • 感谢您的代码帮助,但我仍然没有将值绑定到动态生成的文本框。我可以在这里给你看图片,这样你就可以更接近问题了吗?
  • 我已将图片附加到问题
猜你喜欢
  • 2015-05-18
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多