在同一页面中使用两次时,我的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);
}
});
}
答案 0 :(得分:0)
终于找到了答案。
由于以下问题,我的代码无效。
名称冲突,因为用户控件的Jquery函数具有相同的名称,只有最后呈现的用户控件被附加到jquery自动完成功能,通过添加&lt;%= this.ID%&gt来解决此问题; 到用户控件中的Jquery函数。
控制名称冲突,通过使用clientID来访问我的JQuery脚本中的控件来解决这个问题,例如 $(“#&lt;%= txtLocation.ClientID%&gt;”) < / p>
我的最终用户控件代码如下。
<%@ 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>