【问题标题】:.NET Repeater - custom server validation.NET 中继器 - 自定义服务器验证
【发布时间】:2012-08-11 14:06:42
【问题描述】:

我不明白如何在转发器中进行正确的自定义服务器端验证。

我有三列中继器控件: 1) 注册 - 复选框 2) 参加 - 复选框 3) 时间 - 文本框

我需要编写验证时间文本框值的服务器端自定义验证。

现在我已经在我的转发器中编写了以下自定义验证:

 <asp:Repeater runat="server" ID="rptResidents" OnItemDataBound="rptResidents_ItemDataBound">
 ....
    <asp:CheckBox runat="server" CssClass="RegisterSpan" name="RegisterChkName" ID="chkRegister" />
    <asp:CheckBox runat="server" CssClass="AttendedSpan" name="AttendedChkName" ID="chkAttended" />
    <asp:TextBox runat="server" ID="txtTime" Width="30px" MaxLength="3" Columns="3"></asp:TextBox>
    <asp:CustomValidator runat="server" Width="1px" ID="valTimeRange" ControlToValidate="txtTime" OnServerValidate="valTimeRange_ServerValidate" Text="*" ErrorMessage="Minutes cannot exceed the minutes of the event" />
  ....

服务器端验证功能:

protected void valTimeRange_ServerValidate(object sender, ServerValidateEventArgs e)
{
    int maxAllowedMinutes = 0;
    maxAllowedMinutes = Convert.ToInt32(this.txtMaxAllowedMinutes.Text);

            int val = Convert.ToInt32(e.Value);
            if (val > maxAllowedMinutes)
            {
                e.IsValid = false;
            }
            else
            {
                e.IsValid = true;
            }           
}

这很好用。但我需要添加额外的逻辑。我还需要使用复选框 - 在我的自定义服务器端验证中注册和参加。

所以 ServerValidate 函数看起来像:

protected void valTimeRange_ServerValidate(object sender, ServerValidateEventArgs e)
{
    if (CHECKBOX_REGISTER_IS_CHECKED && CHECKBOX_ATTENDED_IS_CHECKED) //?????
    {
            DO_VALIDATION_DESCRIBED_ABOVE
    }
    else
    {
        e.IsValid = true; //NO NEED TO VALIDATE TIME HERE OR ANY OTHER LOGIC COULD BE HERE
    }
}

所以这里的问题是 - 我不明白如何在服务器端验证方法中获取复选框值(两个复选框都来自转发器)。

【问题讨论】:

  • 我认为我为您的问题找到了一个很好的答案:stackoverflow.com/a/14654349/2914856 我看到您正在从文本字段中获取 maxAllowedMinutes。也许使用 javascript 或 jQuery 来验证这些控件并验证客户端会很好。除非你有理由不使用 javascripts。

标签: .net validation


【解决方案1】:

查看源码你会发现:

<input name="myRepeater$ctl00$myTextBox" type="text" id="myRepeater_myTextBox_0" />
<input name="myRepeater$ctl01$myTextBox" type="text" id="myRepeater_myTextBox_1" />
<input name="myRepeater$ctl02$myTextBox" type="text" id="myRepeater_myTextBox_2" />

从后面的代码中,您可以通过 ClientID 属性访问这个生成的 id。您还可以通过搜索转发器的 Items 属性来访问各个控件:

TextBox textBox2 = myRepeater.Items[1].FindControl("myTextBox");

编辑:您可以显式设置控件的 ClientID。您必须将其 ClientIDMode 设置为 Static 并在数据绑定时更改 ID:

protected void Page_Load(object sender, EventArgs e)
{
    myRepeater.ItemDataBound += new RepeaterItemEventHandler(myRepeater_ItemDataBound);
    myRepeater.DataSource = new int[3];
    myRepeater.DataBind();
}

void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    var textbox = e.Item.FindControl("myTextBox");
    textbox.ClientIDMode = ClientIDMode.Static;
    textbox.ID = "myTextBox" + (e.Item.ItemIndex + 1);
}

提供此 HTML

<input name="myRepeater$ctl01$myTextBox1" type="text" id="myTextBox1" />
<input name="myRepeater$ctl02$myTextBox2" type="text" id="myTextBox2" />
<input name="myRepeater$ctl02$myTextBox3" type="text" id="myTextBox3" />

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2018-07-23
    • 1970-01-01
    • 2018-11-19
    • 2017-07-27
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多