我有一个包含文本框和标签的转发器控件。我想根据用户在文本框中设置的值在客户端设置标签值,以避免往返服务器。
我编写了一个由文本框OnChange事件调用的JavaScript函数。现在我只需要访问该函数中的文本框和标签。我知道我应该通过<%# Container.FindControl(...).ClientID %>
访问控件但我无法在OnChange事件中使用它。我也试过<%# Container.ItemIndex %>
,以防嵌套引号出现问题,但这也没有用。
我是ASP.NET的新手所以我假设我错过了一些明显的东西。
这是我到目前为止所做的事情(目前正在尝试使用<%# Container.ItemIndex %>
):
<asp:Content ID="Content3" ContentPlaceHolderID="regionBody" runat="server">
<table class="DataGrid">
<tr class="HeaderStyle">
<td>Item</td>
<td>Weight (kg)</td>
<td>Total Volume (m3):</td>
</tr>
<asp:Repeater ID="rptItems" runat="server"
OnItemDataBound="rptItems_ItemDataBound" >
<ItemTemplate>
<tr class='<%# Container.ItemIndex % 2 == 0
? "ItemStyle"
: "AlternatingItemStyle" %>'
style="text-align: center">
<td>
<asp:Label ID="lblItemNum" runat="server" />
</td>
<td>
<asp:TextBox ID="txtWeight" Height="20px" Width="40px"
runat="server" Visible="true"
OnChange="ValidateItemWeightAndSetVolume(0);" />
</td>
<td>
<asp:Label ID="lblVolume" runat="server"
Visible="true" CssClass="numericLeft" />
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
</asp:Content>
以下是JavaScript函数:
function ValidateItemWeightAndSetVolume(itemIndex) {
var weightId = "regionBody_rptItems_txtWeight_" + itemIndex;
var volumeId = "regionBody_rptItems_lblVolume_" + itemIndex;
var txtWeight = document.getElementById(weightId);
var lblVolume = document.getElementById(volumeId);
var volume = 0;
var validated = ValidateItemWeight(txtWeight);
if (validated) {
var weight = parseFloat(txtWeight.value);
volume = weight / <%=VOLUMETRIC_WEIGHT_CONVERSION%>;
}
// asp:label is rendered as a span in HTML. So to set the value,
// have to set the inner HTML.
lblVolume.innerHTML = volume;
}
第二个函数ValidateItemWeight只检查用户在某些限制之间输入的数值,如果他们没有,则显示警告。
上面的代码可行,因为我只是将一个整数传递给函数OnChange="ValidateItemWeightAndSetVolume(0);"
,但这只适用于第一个转发器项。如果我按如下方式对其进行修改,则该功能不会运行:OnChange="ValidateItemWeightAndSetVolume(<%# Container.ItemIndex %>);"
答案 0 :(得分:1)
您可以在评论中使用<%# Container.ItemIndex %>
作为我们的建议:
... OnChange="ValidateItemWeightAndSetVolume(<%# Container.ItemIndex %>`);" />
但是如果你可以使用javascript来获取标签(而不是像string-id那样的index concat)会更好(
)使用OnChange = ValidateItemWeightAndSetVolume(this)
并更改js函数,如下所示:
function ValidateItemWeightAndSetVolume(textBox) {
var txtWeight = textBox;
var lblVolume = $(textBox).closest("td").next("td").find("span")[0];
var volume = 0;
var validated = ValidateItemWeight(txtWeight);
if (validated) {
var weight = parseFloat(txtWeight.value);
volume = weight / <%=VOLUMETRIC_WEIGHT_CONVERSION%>;
}
lblVolume.innerHTML = volume;
}
此外,您可以在HeaderTemplate
内使用FooterTemplate
和Repeater
,如下所示:
<asp:Repeater ID="rptItems" runat="server">
<HeaderTemplate>
<table class="DataGrid">
<tr class="HeaderStyle">
<td>Item</td>
<td>Weight (kg)</td>
<td>Total Volume (m3):</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<!-- Your item template here -->
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
这样可以保持标记清洁。