ASP .NET 冲突中具有 HiddenFields 的单个自动完成 UserControl 的多个实例

Multiple Instances of single Autocomplete UserControl with HiddenFields in ASP .NET conflict

我的用户控件在同一页面中使用两次时出现问题。以下是我的位置用户控件。

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UCLocations.ascx.cs" Inherits="UCLocations" EnableTheming="true" %>
<script type="text/javascript">
    $(function () {
        GetLocations();
    });
    var prmInstance = Sys.WebForms.PageRequestManager.getInstance();
    prmInstance.add_endRequest(function () {
        GetLocations();
    });
    function GetLocations() {
        $("[id$=txtLocation]").autocomplete({
            source: function (request, response) {
                AjaxCallSession("<%= ResolveUrl("~/CompanyControls/WebMethods.aspx/GetLocationsFiltered") %>", request.term, $("[id$=hfSession]").val(), response)
            },
            select: function (e, i) {
                $("[id$=hfLocation]").val(i.item.val);
            },
            minLength: 1
        });
        }
</script>
<asp:TextBox ID="txtLocation" runat="server" Visible="false"></asp:TextBox>
<asp:HiddenField ID="hfLocation" runat="server"/>
<asp:HiddenField ID="hfSession" runat="server"/>
<asp:Button ID="btnAddLocation" runat="server" Text="Add" OnClick="btnAddLocation_Click" Visible="false" />
<br />
<br />
<asp:GridView ID="grvLocations" runat="server" OnRowDeleting="grvLocations_RowDeleting" AutoGenerateColumns="false"
    DataKeyNames="Value" Visible="false">
    <Columns>
        <asp:BoundField DataField="Value" />
        <asp:BoundField DataField="Text" HeaderText="Location" />
        <asp:CommandField ShowDeleteButton="True" ButtonType="Image" DeleteImageUrl="~/Content/Images/Delete.jpg" />
    </Columns>
</asp:GridView>

以下是我使用用户控件的页面。

<%@ Page Language="C#" CodeFile="Test.aspx.cs" Inherits="Test" MasterPageFile="~/UI/HomePage.master" %>

<%@ Register Src="~/CompanyControls/UCLocations.ascx" TagPrefix="uc1" TagName="UCLocations" %>


<asp:Content ContentPlaceHolderID="PageContent" runat="server">
    <div class="row">
        <div class="col-md-12 form-inline">
            <table class="table table-sm">
                <tr>
                    <td>
                        <uc1:UCLocations runat="server" ID="lc" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <uc1:UCLocations runat="server" ID="lc2" />
                    </td>
                </tr>
            </table>
        </div>
    </div>
</asp:Content>

问题是每次调用 GetLocationsFiltered 方法时,仅传递第一个用户控件的 hfsession。如何解决这个冲突。

将 ClientIDMode 设置为静态无效(问题仍然存在,第一个 hfsession 被传递),也像 $('#<%= hfSession.ClientID %>' 一样访问控制。 val() 也没有工作(只有第二个 UC 工作,第一个完全停止工作)。还有其他建议。

Ajax功能如下

function AjaxCallSession(url, prefix, sessionkey, response) {
    $.ajax({
        url: url,
        data: "{ 'prefix': '" + prefix + "', 'sessionkey': '" + sessionkey + "' }",
        dataType: "json",
        type: "POST",
        contentType: "application/json; charset=utf-8",
        success: function (r) {
            response($.map(r.d, function (item) {
                return {
                    label: item.split('|')[0],
                    val: item.split('|')[1]
                }
            }))
        },
        error: function (r) {
            alert(r.responseText);
        },
        failure: function (r) {
            alert(r.responseText);
        }
    });
}

终于找到答案了。

由于以下问题,我的代码无法运行。

  1. 名称冲突,因为两个用户控件的 Jquery 函数具有相同的名称,只有最后呈现的用户控件附加到 jquery 自动完成功能,通过添加解决此问题<%= this.ID %> 到我在用户控件中的 Jquery 函数。

  2. 控件名称冲突,通过使用 clientID 访问我的 JQuery 脚本中的控件解决了这个问题 $("#<%=txtLocation.ClientID%>")

我最终的Usercontrol代码如下

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UCLocations.ascx.cs" Inherits="UCLocations" EnableTheming="true" %>
<script type="text/javascript">
    $(function () {
        GetLocations<%= this.ID %>();
    });
    var prmInstance = Sys.WebForms.PageRequestManager.getInstance();
    prmInstance.add_endRequest(function () {
        GetLocations<%= this.ID %>();
    });
    function GetLocations<%= this.ID %>() {
        $("#<%=txtLocation.ClientID%>").autocomplete({
            source: function (request, response) {
                AjaxCallSession("<%= ResolveUrl("~/CompanyControls/WebMethods.aspx/GetLocationsFiltered") %>", request.term, $('#<%= hfSession.ClientID %>').val(), response)
            },
            select: function (e, i) {
                $('#<%= hfLocation.ClientID %>').val(i.item.val);
            },
            minLength: 1
        });
        }
</script>
<asp:TextBox ID="txtLocation" runat="server" Visible="false"></asp:TextBox>
<asp:HiddenField ID="hfLocation" runat="server" />
<asp:HiddenField ID="hfSession" runat="server" />
<asp:Button ID="btnAddLocation" runat="server" Text="Add" OnClick="btnAddLocation_Click" Visible="false" />
<br />
<br />
<asp:GridView ID="grvLocations" runat="server" OnRowDeleting="grvLocations_RowDeleting" AutoGenerateColumns="false"
    DataKeyNames="Value" Visible="false">
    <Columns>
        <asp:BoundField DataField="Value" />
        <asp:BoundField DataField="Text" HeaderText="Location" />
        <asp:CommandField ShowDeleteButton="True" ButtonType="Image" DeleteImageUrl="~/Content/Images/Delete.jpg" />
    </Columns>
</asp:GridView>