2016-09-13 2 views
3

Мне нужен простой способ обеспечить, чтобы некоторые свойства в классе содержали значения и/или находились в пределах диапазона (то есть: длиной не более 50 символов). Я использовал вопрос и ответ на вопрос How to validate Class properties?, к сожалению, я не смог заставить его работать.Как проверить требуемые поля в свойствах класса?

Чтобы проверить это, я создал очень простой пример WinForm с использованием C#. Несмотря на то, что я делаю все одинаково, он никогда не выдает исключение проверки, когда я применяю неверные значения (то есть: установка возраста выше допустимого предела).

Может кто-нибудь объяснить, почему это не исключение? Это как если бы класс не знал, что он должен использовать необходимые атрибуты.

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; } 
} 
} 
+0

Это не собирается проверять свойства при установке значений, вы должны [спусковой проверку вручную] (http://odetocode.com/blogs/scott/archive/2011/ 06/29/ручная проверка-с-данных annotations.aspx). – Michael

+0

@Michael - Можете ли вы создать ответ, так как ваша ссылка содержит информацию, которая позволила мне решить проблему? – ThePeter

+0

Вы также можете опубликовать свой собственный ответ и самостоятельно принять его после задержки, если никаких других ответов недостаточно. Это ответит на вопрос, который поможет будущим читателям. – Tim

ответ

3

Добавить новый метод в класс 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); 
     } 
    } 
} 
} 
0

Это было долгое время, так как я сделал это, но я дам ему выстрелили. Он считает, что вам нужно вручную проверить класс, используя класс System.ComponentModel.DataAnnotations.Validator. Вы также можете реализовать IValidatableObject в классе, который нуждается в проверке - мне нравится этот подход.

+0

Предлагаю вам добавить ссылку blog post] (http://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx), который показывает, что именно вы предлагаете сделать. – Michael

+0

@Michael ... Извините, Micheal не видел вашего комментария, пока я не отправил свой ответ. Я фактически отвечаю на вопросы, основанные на опыте и знаниях, а не на поиске ответов. Если вы хотите опубликовать аналогичный ответ на мой вопрос, я с удовольствием удалю ответ. Суть в том, что этому парню нужна помощь. –

+0

@Big Daddy - Спасибо за помощь. Ты помог мне направить меня к ответу. Я ценю помощь! :) – ThePeter

Смежные вопросы