我想要一种简单的方法来确保类中的某些属性包含值和/或在一个范围内(即:不超过50个字符长)。 我使用了关于如何验证类属性的问题和答案? 不幸的是,我无法让它工作。
为了测试它,我使用C#创建了一个非常简单的WinForm示例。 尽管我正在做同样的事情,但是当我应用不正确的值时它永远不会抛出验证异常(即:将年龄设置为高于允许的限制)。
有人可以解释为什么它不抛出异常? 就好像该类不知道它应该使用所需的属性。
Form1.cs的
using System; using System.Collections.Generic; using System.Windows.Forms; using System.ComponentModel.DataAnnotations; namespace RequiredFieldsInClassExample { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnTest_Click(object sender, EventArgs e) { try { lstStatus.Items.Clear(); lstStatus.Items.Add("Creating list of people"); List<Person> CollectionOfPeople = new List<Person>(); lstStatus.Items.Add("Creating a good person"); Person Jeff = new Person(); Jeff.Age = 33; Jeff.Firstname = "Jeff"; Jeff.Lastname = "Jefferson"; Jeff.GroupCode = "JJJ"; CollectionOfPeople.Add(Jeff); lstStatus.Items.Add("Creating a bad person"); Person Tim = new Person(); Tim.Age = 444; Tim.Firstname = ""; Tim.Lastname = ""; Tim.GroupCode = ""; CollectionOfPeople.Add(Tim); lstStatus.Items.Add("Done"); } catch (ValidationException Exp) { MessageBox.Show(this, Exp.Message, "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } catch (Exception Exp) { MessageBox.Show(this, Exp.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } }Person.cs
using System.ComponentModel.DataAnnotations; public class Person { private int m_iAge = 1; private string m_sFirstname = "Unknown"; private string m_sLastname = ""; private string m_sGroupCode = "AAA"; //[Required(ErrorMessage = "Age is a required field.")] //[Range(1, 100, ErrorMessage = "A persons age must be between 1 and 100.")] [Required, Range(1, 100)] public int Age { get { return m_iAge; } set { m_iAge = value; } } //[Required(ErrorMessage = "Firstname is a required field.")] [Required] public string Firstname { get { return m_sFirstname; } set { m_sFirstname = value; } } public string Lastname { get { return m_sLastname; } set { m_sLastname = value; } } //[StringLength(3)] public string GroupCode { get { return m_sGroupCode; } set { m_sGroupCode = value; } } }I wanted a simple way to ensure that some properties in a class contained values and/or were within a range (ie: not more than 50 characters long). I used the question and answer on How to validate Class properties? unfortunately I was not able to get it to work.
To test it, I created a very simple WinForm example using C#. Even though I am doing everything the same, it never throws a validation exception when I apply incorrect values (ie: setting the age above the allowed limit).
Can someone explain why it does not throw the exception? It's as if the class doesn't know it is supposed to use the required attributes.
Form1.cs
using System; using System.Collections.Generic; using System.Windows.Forms; using System.ComponentModel.DataAnnotations; namespace RequiredFieldsInClassExample { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnTest_Click(object sender, EventArgs e) { try { lstStatus.Items.Clear(); lstStatus.Items.Add("Creating list of people"); List<Person> CollectionOfPeople = new List<Person>(); lstStatus.Items.Add("Creating a good person"); Person Jeff = new Person(); Jeff.Age = 33; Jeff.Firstname = "Jeff"; Jeff.Lastname = "Jefferson"; Jeff.GroupCode = "JJJ"; CollectionOfPeople.Add(Jeff); lstStatus.Items.Add("Creating a bad person"); Person Tim = new Person(); Tim.Age = 444; Tim.Firstname = ""; Tim.Lastname = ""; Tim.GroupCode = ""; CollectionOfPeople.Add(Tim); lstStatus.Items.Add("Done"); } catch (ValidationException Exp) { MessageBox.Show(this, Exp.Message, "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } catch (Exception Exp) { MessageBox.Show(this, Exp.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } }Person.cs
using System.ComponentModel.DataAnnotations; public class Person { private int m_iAge = 1; private string m_sFirstname = "Unknown"; private string m_sLastname = ""; private string m_sGroupCode = "AAA"; //[Required(ErrorMessage = "Age is a required field.")] //[Range(1, 100, ErrorMessage = "A persons age must be between 1 and 100.")] [Required, Range(1, 100)] public int Age { get { return m_iAge; } set { m_iAge = value; } } //[Required(ErrorMessage = "Firstname is a required field.")] [Required] public string Firstname { get { return m_sFirstname; } set { m_sFirstname = value; } } public string Lastname { get { return m_sLastname; } set { m_sLastname = value; } } //[StringLength(3)] public string GroupCode { get { return m_sGroupCode; } set { m_sGroupCode = value; } } }最满意答案
在Person类中添加一个新方法以执行验证。 新的“Validate”方法适用于所需的值,范围和字符串长度。
Person.cs
using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; public class Person { private int m_iAge = 1; private string m_sFirstname = "Unknown"; private string m_sLastname = ""; private string m_sGroupCode = "AAA"; [Required(ErrorMessage = "Age is a required field.")] [Range(1, 100, ErrorMessage = "A persons age must be between 1 and 100.")] public int Age { get { return m_iAge; } set { m_iAge = value; } } [Required(ErrorMessage = "Firstname is a required field.")] public string Firstname { get { return m_sFirstname; } set { m_sFirstname = value; } } public string Lastname { get { return m_sLastname; } set { m_sLastname = value; } } [StringLength(3, MinimumLength = 3)] public string GroupCode { get { return m_sGroupCode; } set { m_sGroupCode = value; } } public void Validate() { ValidationContext context = new ValidationContext(this, serviceProvider: null, items: null); List<ValidationResult> results = new List<ValidationResult>(); bool isValid = Validator.TryValidateObject(this, context, results, true); if (isValid == false) { StringBuilder sbrErrors = new StringBuilder(); foreach (var validationResult in results) { sbrErrors.AppendLine(validationResult.ErrorMessage); } throw new ValidationException(sbrErrors.ToString()); } } }回到表单后面的代码中,您只需要为每个类调用Validate方法。
Form1.cs的
using System; using System.Collections.Generic; using System.Windows.Forms; using System.ComponentModel.DataAnnotations; namespace RequiredFieldsInClassExample { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnTest_Click(object sender, EventArgs e) { try { lstStatus.Items.Clear(); lstStatus.Items.Add("Creating list of people"); List<Person> CollectionOfPeople = new List<Person>(); lstStatus.Items.Add("Creating a good person"); Person Jeff = new Person(); Jeff.Age = 33; Jeff.Firstname = "Jeff"; Jeff.Lastname = "Jefferson"; Jeff.GroupCode = "JJJ"; // LOOK! This line was added Jeff.Validate(); CollectionOfPeople.Add(Jeff); lstStatus.Items.Add("Creating a bad person"); Person Tim = new Person(); Tim.Age = 444; Tim.Firstname = ""; Tim.Lastname = ""; Tim.GroupCode = ""; // LOOK! This line was added Tim.Validate(); CollectionOfPeople.Add(Tim); lstStatus.Items.Add("Done"); } catch (ValidationException Exp) { MessageBox.Show(this, Exp.Message, "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } catch (Exception Exp) { MessageBox.Show(this, Exp.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } }Add a new method into the Person class to perform the validation. The new "Validate" method works for required values, range, and string length.
Person.cs
using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; public class Person { private int m_iAge = 1; private string m_sFirstname = "Unknown"; private string m_sLastname = ""; private string m_sGroupCode = "AAA"; [Required(ErrorMessage = "Age is a required field.")] [Range(1, 100, ErrorMessage = "A persons age must be between 1 and 100.")] public int Age { get { return m_iAge; } set { m_iAge = value; } } [Required(ErrorMessage = "Firstname is a required field.")] public string Firstname { get { return m_sFirstname; } set { m_sFirstname = value; } } public string Lastname { get { return m_sLastname; } set { m_sLastname = value; } } [StringLength(3, MinimumLength = 3)] public string GroupCode { get { return m_sGroupCode; } set { m_sGroupCode = value; } } public void Validate() { ValidationContext context = new ValidationContext(this, serviceProvider: null, items: null); List<ValidationResult> results = new List<ValidationResult>(); bool isValid = Validator.TryValidateObject(this, context, results, true); if (isValid == false) { StringBuilder sbrErrors = new StringBuilder(); foreach (var validationResult in results) { sbrErrors.AppendLine(validationResult.ErrorMessage); } throw new ValidationException(sbrErrors.ToString()); } } }Back in the code behind of the form, you just need to call the Validate method for each class.
Form1.cs
using System; using System.Collections.Generic; using System.Windows.Forms; using System.ComponentModel.DataAnnotations; namespace RequiredFieldsInClassExample { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnTest_Click(object sender, EventArgs e) { try { lstStatus.Items.Clear(); lstStatus.Items.Add("Creating list of people"); List<Person> CollectionOfPeople = new List<Person>(); lstStatus.Items.Add("Creating a good person"); Person Jeff = new Person(); Jeff.Age = 33; Jeff.Firstname = "Jeff"; Jeff.Lastname = "Jefferson"; Jeff.GroupCode = "JJJ"; // LOOK! This line was added Jeff.Validate(); CollectionOfPeople.Add(Jeff); lstStatus.Items.Add("Creating a bad person"); Person Tim = new Person(); Tim.Age = 444; Tim.Firstname = ""; Tim.Lastname = ""; Tim.GroupCode = ""; // LOOK! This line was added Tim.Validate(); CollectionOfPeople.Add(Tim); lstStatus.Items.Add("Done"); } catch (ValidationException Exp) { MessageBox.Show(this, Exp.Message, "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } catch (Exception Exp) { MessageBox.Show(this, Exp.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } }更多推荐
发布评论