在ASP .NET中使用HiddenFields的单个自动完成UserControl的多个实例发生冲突

时间:2018-03-26 04:44:46

标签: c# asp.net twitter-bootstrap user-controls jquery-ui-autocomplete

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

<%@ 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>

以下是我使用usercontrol的页面。

<%@ 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 方法时,只会传递第一个usercontrol的 hfsession 。如何解决这一冲突。

使ClientIDMode变为静态不起作用(问题保持不变,第一次hfsession传递),还访问控件,如 $('#&lt;%= hfSession.ClientID%&gt;')。val()< / strong>也没有工作(只有第二个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 个答案:

答案 0 :(得分:0)

终于找到了答案。

由于以下问题,我的代码无效。

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

  2. 控制名称冲突,通过使用clientID来访问我的JQuery脚本中的控件来解决这个问题,例如 $(“#&lt;%= txtLocation.ClientID%&gt;”) < / p>

  3. 我的最终用户控件代码如下。

    <%@ 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>