【问题标题】:ASP.NET form reload forced from javascript conflicts with JQuery autocomplete textbox fillup?javascript 强制 ASP.NET 表单重新加载与 JQuery 自动完成文本框填充冲突?
【发布时间】:2020-12-23 13:44:55
【问题描述】:

我定义了一个 ASP.NET 表单,其中包含以下表单元素:TextBoxHiddenFieldDropDownList,定义如下:

<asp:TextBox ID="_txtData" runat="server" ClientIDMode="Static" />
<asp:HiddenField ID="_hdnData" runat="server" ClientIDMode="Static" Value="" />
<asp:DropDownList ID="_ddlData" runat="server" DataSourceID="_sdsData" DataTextField="data" DataValueField="id" AppendDataBoundItems="true" AutoPostBack="true" >
    <asp:ListItem Text="TUTTI" Value="" Selected="True" />
</asp:DropDownList>

_ddlData 来自以这种方式定义的数据源:

<asp:SqlDataSource
    ID="_sdsData" 
    runat="server"
    ConnectionString="<%$ ConnectionStrings:db %>"
    ProviderName="<%$ ConnectionStrings:db.ProviderName %>"
    SelectCommand="
        SELECT 
            id, 
            data
        FROM 
            table_data
        WHERE 
            (@id IS NULL) OR (id = @id)
        ORDER BY targa">
        <SelectParameters>
            <asp:ControlParameter 
                ControlID="_hdnData" 
                PropertyName="Value" 
                Direction="Input" 
                ConvertEmptyStringToNull="true" 
                DbType="Int32" 
                DefaultValue="" 
                Name="id" />
        </SelectParameters>
</asp:SqlDataSource> 

_hdnData_txtData 以这种方式通过 javascript/JQuery 提供:

[原码]

var _hdnData = null;
var _txtData = null;

$(function () {
    _hdnData = $("input[id$='_hdnData']");
    _txtData = $("input[id$='_txtData']");

    GetData(_txtData , _hdnData );
});

function GetData(source_widget, dest_widget) {
    $.ajax({
        type: "POST",
        url: "/Service/WSDataService.asmx/GetData",
        dataType: "json",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            var datafromServer = data.d.split("<br />");

            source_widget.autocomplete({
                source: datafromServer,
                select: function (event, ui) {
                    var _data = ui.item.value;

                    var _tokens = _data.split("\t");


                    if (_tokens.length < 3)
                        return;

                    var _value = _tokens[_tokens.length - 1].replace(']', '').replace('[', '');

                    dest_widget.val(_value).closest("form").submit();
                }
            });
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert(textStatus);
        }
    });
}

[JQuery 优化代码由@Tomalak 提供]

var _hdnData = null;
var _txtData = null;

$.postJSON = function (url, data, success) {
    return $.ajax({
        type: "POST",
        url: url,
        data: JSON.stringify(data),
        contentType: "application/json; charset=utf-8",
        success: success || null
    });
};

var raw_data = $.postJSON("/Service/WSDataService.asmx/GetData", {})
    .then(function (data) {
        return data.d.split("<br />");
    })
    .fail(function (XMLHttpRequest, textStatus, errorThrown) {
        alert(textStatus);
    });

$(function () {
    raw_data.done(function (items) {
        $("input[id$='_txtData']").autocomplete({
            source: items,
            select: function (event, ui) {
                var _data = ui.item, _value;

                // calculate _value ...
                $("input[id$='_hdnData ']")
                    .val(_value)
                    .closest("form").submit();
            }
        });
    });
});

当 JQuery autocomplete 的选择事件发生时,表单被提交,一旦它重新加载我注意到两个主要问题:

  1. _txtData 设置为用户在选择事件发生时输入的部分值(即不是autocomplete 菜单上选择/可见的实际值)

  2. _ddlData 选择事件之前存在的值与来自其数据源的新数据合并。

顺便说一句,我现在不想更改 SQLDataSource 或使用更新或更新的范例(如 Microsoft Entities Framework)的数据绑定组件。

【问题讨论】:

    标签: javascript jquery asp.net


    【解决方案1】:

    您遇到了时间问题,例如 your previous question

    您将提交表单作为select 事件的一部分。在select 事件之后,jQuery UI 将所选值写入表单字段,但此代码永远不会运行。 .closest("form").submit() 立即重新加载页面。此时,自动完成字段仍然只包含用户输入的内容。

    快速而肮脏的解决方案是在短暂延迟后发送表单,让其他事件有机会完成。

    // ... 
    select: function (event, ui) {
        var _data = ui.item,
            _value,
            $form = $(this).closest("form");
    
        // calculate _value ...
    
        $("input[id$='_hdnData ']").val(_value);
    
        setTimeout(function () { $form.submit(); }, 50);
    }
    

    【讨论】:

    • 如果我需要使用自动完成功能进行即时过滤怎么办?
    • @weirdgyn 然后你会在自动完成的成功回调中调用$form.submit();
    • 我的意思是我需要与 ajax call 一起过滤数据。您上次编写的代码是使用自动完成绑定小部件在用户迭代之前获取数据..
    • @weirdgyn 这不会改变我的答案。自动完成小部件将有一个成功回调(在 jQuery UI 自动完成中它是 response event)。您需要在该回调中调用$form.submit(),即在您收到自动完成响应并将接收到的值写入表单字段后,它可以通过表单 POST 传输。
    • 也许我对 JQuery 的无知感到困惑,但我很确定这段代码不支持服务器端过滤(没有一些返工)。也许我的问题并不清楚。我需要以这种方式更新它。在页面加载时,Ajax 调用开始从 web 服务请求数据,但考虑到数据量,我得到了一个错误......我找到了一个实现服务器端过滤的解决方案(即更改源:带有 ajax 调用的项目)但我'我不能在这段代码上做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2017-08-26
    • 2017-10-19
    • 2013-03-20
    • 1970-01-01
    相关资源
    最近更新 更多