2012-08-15 84 views
3

我不明白如何在轉發器中進行適當的自定義服務器端驗證。.NET轉發器 - 自定義服務器驗證

我有三列Repeater控件: 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 
    } 
} 

所以這裏的問題是 - 我不understnd如何讓服務器端驗證方法複選框值(兩個複選框來自中繼器)。

+0

我想我找到了一個很好的答案爲您的問題:http://stackoverflow.com/a/14654349/2914856 我看到你從文本字段獲得maxAllowedMinutes。也許這將是很好的使用JavaScript或jQuery來驗證這些控件並驗證客戶端。除非你有理由不要 使用javascripts。 – 2013-10-25 14:11:59

回答

0

查看源代碼,你會發現:

<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。您也可以通過你的中繼的項目屬性搜索訪問各個控件:

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

編輯:您可以明確設置ClientID的一個控制。你必須設置其的ClientIDMode爲靜態和更改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" /> 

感謝。