2013-04-27 40 views
1

我希望有人能幫助我顯示錯誤。我想直接在對象上編寫自定義驗證代碼,而不必爲網站UI和使用相同對象的Web服務編寫單獨的方法。這裏是我的代碼有目前,它的作品,但我不認爲這是最好的解決方案,特別是因爲它意味着必須使用一個對象,我真的只是想使用標準的串/ 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。數據控制與驗證控制分離。遵循這個邏輯。

二:您可以自定義驗證控件。您可以選擇在客戶端(javascript)或服務器端運行驗證邏輯。如果你選擇在服務器端運行它,你可以在庫中的某個地方使用一個簡單的函數,這個函數將被你的代碼和自定義驗證器使用。

提交你的郵編您的驗證碼可以是:

// 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; 
}