2013-04-22 4 views
0

HR 시스템의 회사 휴일을 추적하는 페이지가 있습니다. 그러나 지금은 종료 날짜를 편집하려고 시도하는 경우 휴일과 사용자가 우연히 시작 날짜 이전의 종료 날짜를 실수로 입력하면 여전히 모두 유효성이 검증되고 편집이 데이터베이스 테이블에 기록됩니다.asp.net 편집 템플릿 유효성 검사 컨트롤 그룹이 실행되고 false를 반환 할 때 C# IsVaild가 False로 바뀌지 않음

내가 누락 된 부분은 페이지를 항상 True로 확인하는 것입니다. 또한 유효성 검사 컨트롤 집합을 사용하는이 페이지에서 DetailsView를 사용하고 있으며 유효하며 무언가가 유효성 검사를 통과하지 못하면 false로 유효성을 검사합니다.

protected void HolidaysDS_Updated(object sender, SqlDataSourceStatusEventArgs e) 
{ 
    if (e.Exception != null) 
    { 
     lblNullUpdate.Text = "One of your updated fields is invalid. Your update did not occur."; 
     lblNullUpdate.Visible = true; 

     e.ExceptionHandled = true; 
    } 
} 

protected void gvHolidays_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    Page.Validate("EditValidationControls"); 

    if (Page.IsValid == false) 
    { 
     e.Cancel = true; 
    } 
    lblNullUpdate.Visible = false; 
} 

사용자가 업데이트에 null을 전달하고 경우에 예외를 처리 내 현재의 C#은 그 또한 페이지의 유효성을 검사하고 모든 유효하거나 아니었다면 확인해야 할 이벤트입니다.

<h2>Holidays</h2> 
     <asp:Label ID="lblHolidayYear" runat="server" Text="Holiday Year:" AssociatedControlID="ddlHolidayYears"></asp:Label> 
     <asp:DropDownList ID="ddlHolidayYears" runat="server" AutoPostBack="True" 
      DataSourceID="HolidayYearDS" DataTextField="HYear" DataValueField="HYear"> 
     </asp:DropDownList> 
     <asp:GridView ID="gv_Holidays" runat="server" AutoGenerateColumns="False" 
     DataKeyNames="HolidayID" 
      DataSourceID="HolidaysDS" 
      AllowSorting="True" 
      CssClass="gvhours" 
      HeaderStyle-CssClass="header" 
      AlternatingRowStyle-CssClass="alternating" 
      SortedAscendingHeaderStyle-CssClass="sortasc-header" 
      SortedDescendingHeaderStyle-CssClass="sortdesc-header" 
      CommandRowStyle-CssClass="command" 
      PagerStyle-CssClass="page" 
      OnRowUpdating="gvHolidays_RowUpdating"> 
      <AlternatingRowStyle CssClass="alternating" /> 
      <Columns> 
       <asp:CommandField ShowEditButton="true" 
        ValidationGroup="EditValidationControls" /> 
       <asp:BoundField DataField="HolidayID" HeaderText="HolidayID" InsertVisible="False" 
        ReadOnly="True" SortExpression="HolidayID" Visible="False" 
        ShowHeader="False" /> 
       <asp:BoundField DataField="HYear" HeaderText="Year" SortExpression="HYear" Visible="false" /> 
       <asp:BoundField DataField="HStartDate" DataFormatString="{0:MM/dd/yyyy}" 
        HeaderText="Start Date" SortExpression="HStartDate" /> 
       <asp:BoundField DataField="HEndDate" DataFormatString="{0:MM/dd/yyyy}" 
        HeaderText="End Date" SortExpression="HEndDate" /> 
       <asp:BoundField DataField="HDescription" HeaderText="Description" 
        SortExpression="HDescription" /> 
      </Columns> 
      <HeaderStyle CssClass="header" /> 
      <PagerStyle CssClass="page" /> 
      <SortedAscendingHeaderStyle CssClass="sortasc-header" /> 
      <SortedDescendingHeaderStyle CssClass="sortdesc-header" /> 
     </asp:GridView> 
     <asp:Label ID="lblNullUpdate" runat="server" Font-Bold="True" Font-Size="Large" 
      ForeColor="Red" Text="Label" Visible="False"></asp:Label> 
     <asp:SqlDataSource ID="HolidaysDS" runat="server" OnInserted="HolidaysDS_Inserted" 
      OnUpdated="HolidaysDS_Updated" 
      ConnectionString="<%$ ConnectionStrings:TigerTimeTrackerConnectionString %>" 
      ProviderName="<%$ ConnectionStrings:TigerTimeTracker_ConnectionString.ProviderName %>" 
      InsertCommand="usp_Holidays_Add_Holiday" 
      InsertCommandType="StoredProcedure" 
      SelectCommand="usp_Holidays_Get_Holidays_By_Year" 
      SelectCommandType="StoredProcedure" 
      UpdateCommand="usp_Holidays_Update_Holiday" 
      UpdateCommandType="StoredProcedure"> 
       <SelectParameters> 
        <asp:ControlParameter ControlID="ddlHolidayYears" Name="Year" 
         PropertyName="SelectedValue" Type="String" /> 
       </SelectParameters> 
       <UpdateParameters> 
        <asp:Parameter Name="HolidayID" Type="Int32" /> 
        <asp:ControlParameter ControlID="ddlHolidayYears" Name="HYear" PropertyName="SelectedValue" Type="String" /> 
        <asp:Parameter Name="HStartDate" Type="DateTime" /> 
        <asp:Parameter Name="HEndDate" Type="DateTime" /> 
        <asp:Parameter Name="HDescription" Type="String" /> 
       </UpdateParameters> 
       <InsertParameters> 
        <asp:Parameter Name="Year" Type="String" /> 
        <asp:Parameter Name="StartDate" Type="DateTime" /> 
        <asp:Parameter Name="EndDate" Type="DateTime" /> 
        <asp:Parameter Name="Description" Type="String" /> 
       </InsertParameters> 
      </asp:SqlDataSource> 
      <asp:SqlDataSource ID="HolidayYearDS" runat="server" 
       ConnectionString="<%$ ConnectionStrings:TigerTimeTracker_ConnectionString %>" 
       ProviderName="<%$ ConnectionStrings:TigerTimeTracker_ConnectionString.ProviderName %>" 
       SelectCommand="usp_Holidays_Get_Distinct_Holiday_Years" 
       SelectCommandType="StoredProcedure" > 
      </asp:SqlDataSource> 
      <asp:DetailsView ID="dvHolidays" runat="server" Height="50px" Width="125px" 
      AutoGenerateRows="False" 
      DataKeyNames="HolidayID" 
      DataSourceID="HolidaysDS" 
      DefaultMode="Insert" 
      CssClass="dView" 
      HeaderStyle-CssClass="header" 
      FieldHeaderStyle-CssClass="fieldHeader" 
      AlternatingRowStyle-CssClass="alternating" 
      CommandRowStyle-CssClass="command" 
      PagerStyle-CssClass="page" 
      FooterStyle-CssClass="footer" 
      OnItemInserted="dvHolidays_ItemInserted" 
      OnItemInserting="dvHolidays_ItemInserting"> 
       <AlternatingRowStyle CssClass="alternating" /> 
      <CommandRowStyle CssClass="command" /> 
      <FieldHeaderStyle CssClass="fieldHeader" /> 
      <Fields> 
       <asp:BoundField DataField="HolidayID" HeaderText="HolidayID" 
        InsertVisible="False" ReadOnly="True" SortExpression="HolidayID" /> 
       <asp:TemplateField HeaderText="Year: " SortExpression="HYear"> 
        <InsertItemTemplate> 
         <asp:TextBox ID="txtHolidayYear" runat="server" Text='<%# Bind("Year") %>'></asp:TextBox> 
         <asp:RequiredFieldValidator ID="YearRequiredValidator" runat="server" ValidationGroup="InsertValidationControls" ControlToValidate="txtHolidayYear" 
          ErrorMessage="Required"></asp:RequiredFieldValidator> 
         <asp:RegularExpressionValidator ID="YearLengthValidator" runat="server" ValidationGroup="InsertValidationControls" ControlToValidate="txtHolidayYear" 
          ValidationExpression="^[0-9]{4,4}$" ErrorMessage="The Year can only be numeric(0-9), and has to be four digits."></asp:RegularExpressionValidator> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Start Date: " SortExpression="HStartDate"> 
        <EditItemTemplate> 
         <asp:TextBox ID="txtHolidayStartEdit" runat="server" Text='<%# Bind("HStartDate") %>' ClientIDMode="Static"></asp:TextBox> 
         <asp:RequiredFieldValidator ID="HolidayStartEditRequiredValidator" runat="server" ValidationGroup="EditValidationControls" ControlToValidate="txtHolidayStartEdit" 
          ErrorMessage="Required"></asp:RequiredFieldValidator> 
        </EditItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox ID="txtHolidayStartInsert" runat="server" Text='<%# Bind("StartDate") %>' ClientIDMode="Static"></asp:TextBox> 
         <asp:RequiredFieldValidator ID="HolidayStartInsertRequiredValidator" runat="server" ValidationGroup="InsertValidationControls" ControlToValidate="txtHolidayStartInsert" 
          ErrorMessage="Required"></asp:RequiredFieldValidator> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="End Date: " SortExpression="HEndDate"> 
        <EditItemTemplate> 
         <asp:TextBox ID="txtHolidayEndEdit" runat="server" Text='<%# Bind("HEndDate") %>' ClientIDMode="Static"></asp:TextBox> 
         <asp:RequiredFieldValidator ID="HolidayEndEditRequiredValidator" runat="server" ValidationGroup="EditValidationControls" ControlToValidate="txtHolidayEndEdit" 
          ErrorMessage="Required"></asp:RequiredFieldValidator> 
         <asp:CompareValidator ID="HolidayRangeCheckEdit" runat="server" ValidationGroup="EditValidationControls" ControlToValidate="txtHolidayEndEdit" ErrorMessage="End Date must be after Start Date." 
          ControlToCompare="txtHolidayStartEdit" Operator="GreaterThanEqual" Type="Date"></asp:CompareValidator> 
        </EditItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox ID="txtHolidayEndInsert" runat="server" Text='<%# Bind("EndDate") %>' ClientIDMode="Static"></asp:TextBox> 
         <asp:RequiredFieldValidator ID="HolidayEndInsertRequiredValidator" runat="server" ValidationGroup="InsertValidationControls" ControlToValidate="txtHolidayEndInsert" 
          ErrorMessage="Required"></asp:RequiredFieldValidator> 
         <asp:CompareValidator ID="HolidayRangeCheckInsert" runat="server" ValidationGroup="InsertValidationControls" ControlToValidate="txtHolidayEndInsert" 
          ControlToCompare="txtHolidayStartInsert" Operator="GreaterThanEqual" Type="Date" ErrorMessage="Please enter an End Date that is after the Start Date."></asp:CompareValidator> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Description: " SortExpression="HDescription"> 
        <EditItemTemplate> 
         <asp:TextBox ID="txtHolidayDescriptionEdit" runat="server" Text='<%# Bind("HDescription") %>'></asp:TextBox> 
        </EditItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox ID="txtHolidayDescriptionInsert" runat="server" Text='<%# Bind("Description") %>'></asp:TextBox> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:CommandField ShowInsertButton="true" 
        ValidationGroup="InsertValidationControls"/> 
      </Fields> 
      <FooterStyle CssClass="footer" /> 
      <HeaderStyle CssClass="header" /> 
      <PagerStyle CssClass="page" /> 
      </asp:DetailsView> 
     <asp:Label ID="lblInsertUniqueError" runat="server" Font-Bold="True" 
      Font-Size="Large" ForeColor="Red" Text="Label" Visible="False"></asp:Label> 
     </asp:View> 
+0

다시 게시 할 때 GridView를 데이터 바인딩합니까? –

+0

RowUpdated 이벤트에서 gridview에 대한 데이터 소스를 데이터 바인딩합니다. 보호 된 void gvHolidays_RowUpdated (개체 보낸 사람, GridViewUpdatedEventArgs e) { HolidaysDS.DataBind(); } –

답변

1

문제는 전체 시간이 내가 템플릿 필드 대신 gridview에서 바운드 필드를 사용하고 있다는 것입니다. 이 문제를 해결하는 다른 모든 사람들을 위해 업데이트 된 코드가 있습니다.

<asp:GridView ID="gv_Holidays" runat="server" AutoGenerateColumns="False" 
     DataKeyNames="HolidayID" 
      DataSourceID="HolidaysDS" 
      AllowSorting="True" 
      CssClass="gvhours" 
      HeaderStyle-CssClass="header" 
      AlternatingRowStyle-CssClass="alternating" 
      SortedAscendingHeaderStyle-CssClass="sortasc-header" 
      SortedDescendingHeaderStyle-CssClass="sortdesc-header" 
      CommandRowStyle-CssClass="command" 
      PagerStyle-CssClass="page" 
      OnRowUpdating="gvHolidays_RowUpdating"> 
      <AlternatingRowStyle CssClass="alternating" /> 
      <Columns> 
       <asp:CommandField ShowEditButton="true" 
        ValidationGroup="EditValidationControls" /> 
       <asp:BoundField DataField="HolidayID" HeaderText="HolidayID" InsertVisible="False" 
        ReadOnly="True" SortExpression="HolidayID" Visible="False" 
        ShowHeader="False" /> 
       <asp:BoundField DataField="HYear" HeaderText="Year" SortExpression="HYear" Visible="false" /> 
       <asp:TemplateField HeaderText="Start Date" SortExpression="HStartDate" > 
        <EditItemTemplate> 
         <asp:TextBox ID="txtHolidayStartEdit" runat="server" Text='<%# Bind("HStartDate", "{0:MM/dd/yyyy}") %>' ClientIDMode="Static"></asp:TextBox> 
         <asp:RequiredFieldValidator ID="HolidayStartEditRequiredValidator" runat="server" ValidationGroup="EditValidationControls" ControlToValidate="txtHolidayStartEdit" 
          ErrorMessage="Required"></asp:RequiredFieldValidator> 
        </EditItemTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblStartItem" runat="server" Text='<%# Bind("HStartDate", "{0:MM/dd/yyyy}") %>' ></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="End Date" SortExpression="HEndDate" > 
        <EditItemTemplate> 
         <asp:TextBox ID="txtHolidayEndEdit" runat="server" Text='<%# Bind("HEndDate", "{0:MM/dd/yyyy}") %>' ClientIDMode="Static"></asp:TextBox> 
         <asp:RequiredFieldValidator ID="HolidayEndEditRequiredValidator" runat="server" ValidationGroup="EditValidationControls" ControlToValidate="txtHolidayEndEdit" 
          ErrorMessage="Required"></asp:RequiredFieldValidator> 
         <asp:CompareValidator ID="HolidayRangeCheckEdit" runat="server" ValidationGroup="EditValidationControls" ControlToValidate="txtHolidayEndEdit" ErrorMessage="End Date must be after Start Date." 
          ControlToCompare="txtHolidayStartEdit" Operator="GreaterThanEqual" Type="Date"></asp:CompareValidator> 
        </EditItemTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblEndItem" runat="server" Text='<%# Bind("HEndDate", "{0:MM/dd/yyyy}") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:BoundField DataField="HDescription" HeaderText="Description" 
        SortExpression="HDescription" /> 
      </Columns> 
      <HeaderStyle CssClass="header" /> 
      <PagerStyle CssClass="page" /> 
      <SortedAscendingHeaderStyle CssClass="sortasc-header" /> 
      <SortedDescendingHeaderStyle CssClass="sortdesc-header" /> 
     </asp:GridView>