2009-03-17 6 views
22

RequiredFieldValidator가 포스트 백을 막을 수있는 것에 대해 질문이 있습니다.ASP.net RequiredFieldValidator가 포스트 백을 막지 못함

이전의 단순한 aspx 양식으로 작업을 시작했고 전임자는 수동, 서버 측 양식 유효성 검사 (일부 양식 필드에 값이 있는지 확인하고 레이블에 오류 메시지가 표시되지 않는지 확인)를 사용했습니다. 필자는 불필요한 코드를 제거하고 RequiredFieldValidator 컨트롤을 사용하여 수동 검사를 대체한다고 생각했지만 유효성 검사를하는 것처럼 보이지만 다시 게시를 방지하지는 않습니다. 즉, 오류 메시지가 표시되지만 포스트 백이 계속 발생합니다.

양식이 매우 간단하며 CausesValidation = "false"속성 집합이 없습니다.

<asp:TextBox ID="txtPhone" Runat="server" Columns="20" MaxLength="20" /> 
<asp:RequiredFieldValidator ID="rfvPhone" runat="server" Display="Dynamic" 
     ErrorMessage="* Required" ControlToValidate="txtPhone" /> 

난 그냥 하나의 텍스트 상자, 유효성 검사기와 같은 프로젝트에 새로운 웹 양식을 작성 버튼을 제출하고 같은 방식으로 작동 : 내 제어는 다음과 같다. 오류 메시지가 표시되지만 포스트 백이 계속 발생합니다.

이 동작을 일으킬 수있는 전역 또는 프로젝트 전체 설정이 있습니까? web.config 또는 global.asax의 일부입니까?

+0

내 asp : button의 onClientClick 이벤트에 연결했을 때이 문제가 발생했습니다. 이벤트를 주문하고 asp.net에 의해 추가 된 이벤트를 먼저 유지하는 방법이 있다면 다음 이벤트를 취소한다고 가정하면 괜찮을 것입니다. –

답변

31

휴. 좋아요, 기본적으로 새로운 프로젝트를 만들고 web.config를 기존 프로젝트와 비교하여 문제를 발견했습니다. 이 원인은 다음과 같습니다.

<xhtmlConformance mode="Legacy"/> 

줄을 제거하면 예상대로 작동합니다. 인터넷 응용 프로그램을 .net 1.1에서 .net 3.5로 업그레이드 할 때 VisualStudio가 web.config에 해당 행을 추가하는 방법에 대한 블로그 게시물이 발견되었습니다.

블로그 게시물은 주로 그 필드가 .net의 AJAX와 간섭하는 방식에 대해 불만을 토로했지만, 비슷한 방식으로 RequiredFieldValidator에 대해 생성 된 JavaScript로 뒤죽박죽이라고 생각합니다.

+1

와우. 그냥 ... 와우. 나는 결코 전에 이것에 빠지지 않았는가? 서버 측 유효성 검사로 인해 발생하는 이벤트가 중지되지 않고 IsValid 속성 만 설정되기 때문에 이것은 큰 문제입니다. 기본적으로 ASP.NET을 잘못 코딩했습니다. : | – Bryan

+0

이것은 응용 프로그램에서 유효성 검사 문제의 원인을 찾는다는 것을 인정하는 것보다 오래 걸렸습니다. –

+0

이 문제를 해결하기 위해 오랜 시간을 보냈습니다 .... 다른 사용자의 경우이 줄은 IE에서는 잘 작동하지만 크롬, FF 및 오페라에 대해서는이 수정 사항을 제거해야합니다. – Botonomous

0

RequiredFieldValidator에 명시적인 EnableClientScript="True" 매개 변수를 사용해 주실 수 있습니까?

9

유효성 검사는 사용 가능한 경우 클라이언트에서 또는 서버에서 발생할 수 있습니다. 유효성 검사기의 작업은 포스트 백을 방지하는 것이 아니라 입력을 확인하는 것입니다.

자바 스크립트가 활성화되어 있는지 확인하고 명시 적으로 "EnableClientScript"를 true로 설정하십시오.

코드 숨김에서는 유효성 검사기가 클라이언트에서 유효성을 검사하고 항상 "if Page.IsValid"을 사용한다고 신뢰해서는 안됩니다.

+0

흠 ... 양식이 유효한지 확인하기 위해 변경할 수는 있지만이 프로젝트가 내가 만든 웹 프로젝트와 다른 방식으로 작동하는 이유가 궁금합니다. – Dana

+0

유효성 검사기가 프로그래밍 방식으로 Visible = "false"로 설정되어 있거나 Button 클릭이 javascript에서 수동으로 양식 제출을 호출하므로 (DoPostBackWithOptions() 클라이언트 측 호출을 우회 함)? – womp

+0

아니요 - 동일한 프로젝트에서 완전히 새로운 양식을 작성하여 테스트했으며 새 양식은 동일한 동작을 나타냅니다. – Dana

0

양식을 제출하기 위해 텍스트 상자에서 "Enter"키를 누르면 유효성 검사기가 포스트 백을 막지 않을 것이라고 생각합니다.

4

나는 똑같은 문제가 있었지만 그 대답은 상당히 달랐다. 또한 서버 쪽 하드 코드 유효성 검사에서 .NET 유효성 검사로 업그레이드하고있었습니다.

내 경우의 문제는 MSDN 기사 인 URL Rewriting in ASP.NET에서 사용 된 ASP.NET 다시 쓰기 엔진과 관련된 것으로 판명되었습니다. "Actionless Form"의 기본 구현을 사용하는 것이 범인이었습니다 - 분명히이 코드는 이전 버전의 .NET을 기반으로 작성되었으며 포스트 백을 방지하는 양식의 JavaScript는 코드가 누락되어 출력물로 보내지 않고있었습니다. .

Public Class Form 
    Inherits System.Web.UI.HtmlControls.HtmlForm 

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
     MyBase.Render(New ActionlessFormHtmlTextWriter(writer)) 
    End Sub 

End Class 

Public Class ActionlessFormHtmlTextWriter 
    Inherits HtmlTextWriter 

    Sub New(ByVal writer As HtmlTextWriter) 
     MyBase.New(writer) 
     Me.InnerWriter = writer.InnerWriter 
    End Sub 

    Sub New(ByVal writer As System.IO.TextWriter) 
     MyBase.New(writer) 
     MyBase.InnerWriter = writer 
    End Sub 

    Public Overrides Sub WriteAttribute(ByVal name As String, ByVal value As String, ByVal fEncode As Boolean) 

     Dim Context As HttpContext = HttpContext.Current 

     'Skip the action attribute of the form control. 
     If Not (name = "action") OrElse Not Context.Items("ActionAlreadyWritten") Is Nothing Then 

      MyBase.WriteAttribute(name, value, fEncode) 

     Else 
      Context.Items("ActionAlreadyWritten") = True 
     End If 
    End Sub 

End Class 

는 이것이하는 일은 단순히 작업의 속성을 supress, 그러나 어떤을 허용 :

어쨌든, 다른 사람이 재 작성 엔진을 사용하는 경우 사람에,이 솔루션은 다음과 ActionlessForm의 기본 구현을 변경했다 실행할 다른 프레임 워크의 논리. 이 이어야합니다. Microsoft가 양식을 다시 변경하기로 결정한 경우에 대비하십시오.

+0

나는 똑같은 문제가 있었다! 게시 해 주셔서 감사합니다. 문제를 발견하는 데 영원히 걸렸을 것입니다. – Onisemus

관련 문제