需要有关 ASP.NET 的帮助,<asp:Label>验证

问题描述 投票:0回答:1

每当我进行验证并使用 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# 中

尝试了不同类型的验证

c# asp.net validation webforms
1个回答
0
投票

如上所述,尝试以这种方式验证标签是没有意义的。更糟糕的是,您将标签放置在 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";
        }
    }

结果是这样的:

enter image description here

因此,要更改、测试、修改或验证 GridView 中该标签的内容,如上所示,我们可以重新格式化,或使用代码根据数据将我们想要的任何值放入该标签中对于 GridView 的每一行。

© www.soinside.com 2019 - 2024. All rights reserved.