每当我进行验证并使用 ContorlToValidate 将控件分配给验证时。 但每当 asp:label 连接到验证时,它仍然会发出此未捕获的错误。 “Sys.WebForms.PageRequestManagerServerErrorException:Sys.WebForms.PageRequestManagerServerErrorException:无法验证“validatorID”的 ControlToValidate 属性引用的控件“labelID”。” 我使用过 CustomValidator、RegexValidator 和 requiredValidator。 代码是这样的。 `
<asp:GridView ......attributes......
<Columns>
<asp:TemplateField>
<ItemPemplate>
<div>
<asp:Label ID="labelIDn" runat="server" Text='<%# Eval("text") %>'
CssClass="txtSmall"></asp:Label>
<asp:CustomValidator ID="validatorID"
ClientValidationFunction="labelValidator"
ErrorMessage="validation failed"
ControlToValidate="labelID"
Display="Dynamic" runat="server" />
</div>
</ItemTemplate>
<Columns>
<asp:GridView>
网格视图中有更多内容,我写下了我正在尝试验证的位置。 我也尝试过 onservervalidate
这是 ClientValidationFunction 的验证器
function Validator(sender, args) {
var val = args.value.toString();
if (val == null) {
args.IsValid = false;
} else {
var isInt = /^-?[0-9]*$/.test(args.value);
if (isInt) {
args.IsValid = true;
} else {
args.IsValid = false;
}
}
}
当我尝试 onserviervalidate 时,它仍然共享相同的日志记录,但在 c# 中
尝试了不同类型的验证
如上所述,尝试以这种方式验证标签是没有意义的。更糟糕的是,您将标签放置在 GridView 中,并且此类验证无论如何都不会在渲染时触发。
验证器仅适用于输入控件,并且仅当用户更改相关控件时才会触发。
如果您希望在 GridView 中格式化、更改、允许或不允许该标签的给定值,那么您可以(并且应该)在行数据绑定上使用 GridView,并测试该点的值,并且然后根据需要格式化该值。因此,验证器不适用于此类用例。
将代码放置在 GridView 的行数据绑定事件中。
因此,说出 GridView 的标记:
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False" DataKeyNames="ID"
CssClass="table table-hover" Width="50%"
OnRowDataBound="GridView1_RowDataBound" >
<Columns>
<asp:BoundField DataField="FirstName" HeaderText="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="Active">
<ItemTemplate>
<asp:Label ID="lblActive" runat="server" Text="">
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
要加载的代码,以及使用 Row Data Bound 事件(针对 GridView 的每一行运行)测试/检查/更改/重新格式化/修改标签到我们想要的任何内容的代码是这样的:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadGrid();
}
void LoadGrid()
{
string strSQL =
"SELECT * FROM tblHotelsA ORDER BY HotelName";
GridView1.DataSource = General.MyRst(strSQL);
GridView1.DataBind();
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRowView gData = (DataRowView)e.Row.DataItem;
Label lblActive = (Label)e.Row.FindControl("lblActive");
if ((gData["Active"] == null) || ((bool)gData["Active"] == false))
lblActive.Text = "Not Active";
else
lblActive.Text = "Active Hotel";
}
}
结果是这样的:
因此,要更改、测试、修改或验证 GridView 中该标签的内容,如上所示,我们可以重新格式化,或使用代码根据数据将我们想要的任何值放入该标签中对于 GridView 的每一行。