1

我希望有人能帮助我。我想直接在对象上编写自定义验证代码,而不必为网站 UI 和使用相同对象的 Web 服务编写单独的方法。这是我目前拥有的代码,它可以工作,但我认为这不是最好的解决方案,特别是因为这意味着必须使用一个我真的只想使用标准字符串/整数等的对象。我曾认为也许我可以在对象的属性上使用属性,但由于我无法设置属性的值,所以这个想法就消失了。任何帮助将不胜感激。

亲切的问候,亚历克斯

<%@ 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;
    }
}
4

1 回答 1

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;
}
于 2013-04-27T13:16:10.593 回答