2013-04-27 10 views
1

누군가가 나를 도울 수 있기를 바랍니다. 웹 사이트 UI와 동일한 객체를 사용하는 웹 서비스에 별도의 메소드를 작성하지 않고 객체에 직접 사용자 정의 유효성 검사 코드를 작성하려고합니다. 여기에 내가 현재 가지고있는 코드는 있지만 작동하지만 가장 좋은 솔루션이라고 생각하지 않습니다. 특히 표준 문자열/int 등을 사용하고자하는 객체를 사용해야한다는 것을 의미하므로 특히 그렇습니다. 개체의 속성에 특성을 사용할 수 있지만 아이디어가 창 밖으로 나왔다는 특성 값을 설정할 수 없기 때문입니다. 어떤 도움이라도 감사하게 받아 들여질 것입니다.개체에서 유효성 검사 후 CustomValidator를 사용하여 오류 표시

종류와 관련, 알렉스 모든

<%@ Register src="TextBoxControl.ascx" tagname="TextBoxControl" tagprefix="uc1" %> 

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
</asp:Content> 
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 

<asp:ValidationSummary ID = "VS" runat="server" /> 
Name: <uc1:TextBoxControl ID="NameTextBox" runat="server" ErrorMessage="Name is required" /> 
<br />Postcode: <uc1:TextBoxControl ID="PostcodeTextBox" runat="server" ErrorMessage="Postcode is required" /> 
<asp:Button ID="SubmitButton" runat="server" Text="Submit" OnClick="SubmitButton_OnClick" /> 
</asp:Content> 


public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    protected void SubmitButton_OnClick(object sender, EventArgs e) 
    { 
     MyObject obj = new MyObject(); 
     obj.Name = new ValidatedString(NameTextBox.Text); 
     obj.Postcode = new ValidatedString(PostcodeTextBox.Text); 

     NameTextBox.IsValid = obj.Name.Valid; 
     NameTextBox.CustomError = obj.Name.GetErrors(); 
     PostcodeTextBox.IsValid = obj.Postcode.Valid; 
     PostcodeTextBox.CustomError = obj.Postcode.GetErrors(); 
    } 
} 

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TextBoxControl.ascx.cs"  Inherits="WebApplication1.TextBoxControl" %> 
<asp:TextBox ID="ValueTextBox" runat="server"></asp:TextBox> 
    <asp:CustomValidator ID="CV" runat="server" ControlToValidate="ValueTextBox">* </asp:CustomValidator> 
    <asp:RequiredFieldValidator ID="RFV" runat="server" ControlToValidate="ValueTextBox">*</asp:RequiredFieldValidator> 

public partial class TextBoxControl : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public string Text 
    { 
     get 
     { 
      return ValueTextBox.Text; 
     } 
    } 

    public string ErrorMessage 
    { 
     set 
     { 
      RFV.ErrorMessage = value; 
     } 
    } 

    public bool IsValid 
    { 
     set 
     { 
      CV.IsValid = value; 
     } 
    } 

    public string CustomError 
    { 
     set 
     { 
      CV.ErrorMessage = value; 
     } 
    } 
} 


public class MyObject 
{ 
    private ValidatedString _name = new ValidatedString(); 
    public ValidatedString Name 
    { 
     get{ 
      return _name; 
     } 
     set 
     { 
      if (value.Value.Length > 5) 
      { 
       value.Errors.Add("Name exceeded maximum length of 5"); 
       value.Valid = false; 
      } 
      if (value.Value.Contains("a")) 
      { 
       value.Errors.Add("Name cannot contain the letter a"); 
       value.Valid = false; 
      } 


       _name = value; 
     } 
    } 

    private ValidatedString _postcode = new ValidatedString(); 
    public ValidatedString Postcode 
    { 
     get 
     { 
      return _postcode; 
     } 
     set 
     { 
      if (value.Value.Length > 3) 
      { 
       value.Errors.Add("Postcode exceeded maximum length of 5"); 
       value.Valid = false; 

      } 
      if (value.Value.Contains("a")) 
      { 
       value.Errors.Add("Postcode cannot contain the letter a"); 
       value.Valid = false; 

      } 


       _postcode = value; 

     } 
    } 


} 

public class ValidatedString 
{ 
    private string _value = string.Empty; 
    private bool _valid = true; 
    private List<string> _errors = new List<string>(); 
    public ValidatedString() 
    { } 

    public ValidatedString(string value) 
    { 
     _value = value; 
    } 

    public string Value 
    { 
     get 
     { 
      return _value; 
     } 
     set 
     { 
      _value = value; 
     } 
    } 

    public bool Valid 
    { 
     get 
     { 
      return _valid; 
     } 
     set 
     { 
      _valid = value; 
     } 
    } 

    public List<string> Errors 
    { 
     get 
     { 
      return _errors; 
     } 
     set 
     { 
      _errors = value; 
     } 
    } 


    public string GetErrors() 
    { 
     string returnValue = string.Empty; 
     foreach (string error in Errors) 
     { 
      returnValue += error + System.Environment.NewLine; 
     } 
     return returnValue; 
    } 
} 

답변

1

첫째 : 당신의 검증과 데이터를 분리해서. 그들은 서로 다른 두 가지입니다. 그것들을 하나의 클래스로 결합해서는 안됩니다. 유효성 검사기에는 데이터의 유효성을 검사하는 논리가 있습니다. 유효성 검사는 유효성을 검사하는 데이터를 보유하지 않고 그의 책임입니다. 엔티티가 데이터를 보유해야한다고 말하는 다른 클래스가 있습니다.

왜?

  • 미래에 데이터는 다른 곳으로 옮겨 져야합니다. 데이터베이스에서 XML 파일, WCF 등등 뭐든지 말할 수 있습니다. 나는 당신이 오류 메시지 등으로 모든 목록을 전송하고 싶지 않다는 것을 상상할 수 있습니다.
  • 또한 유효성 검사는 국가와 같은 특정 조건에 따라 달라질 수 있습니다. 국가가 기본 국가와 다른 경우 다른 우편 번호 유효성 검사기가 필요하지만 귀하의 사업체는 그대로 유지됩니다.
  • 이 문제는 .NET에서 다시 볼 수 있습니다. 데이터 제어는 유효성 검사 제어와 분리되어 있습니다. 이 논리를 따르십시오.

둘째 : 사용자 지정 유효성 검사 컨트롤을 만들 수 있습니다. 클라이언트 (자바 스크립트) 또는 서버 측에서 유효성 검사 로직을 실행하도록 선택할 수 있습니다. 서버 측에서 실행하도록 선택하면 코드 및 사용자 정의 유효성 검사기에서 사용할 라이브러리의 간단한 어딘가에 하나의 간단한 함수를 사용할 수 있습니다.

당신의 우편 번호에 대한 귀하의 유효성 검사 코드가 될 수있다 :

// Validates a postcode and returning a list of errors. If the list is empty, the postcode is valid. 
public List<string> ValidatePostcode(string postcode) 
{ 
    List<string> errors = new List<string>(); 
    // Assuming postcode is not null. Otherwise, create another check. 
    if (postcode.Length > 3) 
     errors.Add("Postcode exceeded maximum length of 5"); 
    if (postcode.Contains("a")) 
     errors.Add("Postcode cannot contain the letter a"); 
    return errors; 
}