gpt4 book ai didi

c# - 如何验证类属性中的必填字段?

转载 作者:太空狗 更新时间:2023-10-30 01:31:50 25 4
gpt4 key购买 nike

我想要一种简单的方法来确保类中的某些属性包含值和/或在一个范围内(即:长度不超过 50 个字符)。我在 How to validate Class properties? 上使用了问题和答案不幸的是我无法让它工作。

为了测试它,我使用 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; }
}
}

最佳答案

在 Person 类中添加一个新方法来执行验证。新的“验证”方法适用于所需的值、范围和字符串长度。

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

关于c# - 如何验证类属性中的必填字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39476610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com