感谢您的关注和时间。
我想在物业的解决方案中实施验证。这是一个需要您的专业帮助的问题。
我知道在设置值之前我将如何进行验证。但如果传递的值不正确则无法做什么。只是不设置不是一个可接受的解决方案,因为我想向用户返回一个适当的消息(在Web表单的标签中)。我的示例代码是:
private int id;
public int Id
{
get
{ return id; }
set
{
bool result = IsNumber(value);
if (result==false)
{
// What to do if passed data is not valid ? how to give a appropriate message to user that what is wrong ?
}
id = value;
}
}
一个想法是使用return但不允许。
投掷错误看起来不太好,因为我们通常会避免自定义错误。
请指导和帮助我。
感谢期待
haansi
答案 0 :(得分:1)
我认为你最好换另一个例子,因为:
public int Id
{
get { ... }
set
{
if (!IsNumer(value)) // changes to if (value>5)
{
//the code here will never be executed
id = value;
}
}
}
答案 1 :(得分:1)
您可以考虑从属性设置器中抛出适当的异常。这样,主叫方会明白出了什么问题,特别是假设您有关于设置属性的业务规则。当然你确实希望调用者进行验证,如果仍有问题,那么抛出异常似乎并不那么糟糕。
“从属性设置器中抛出异常是有效且可接受的。” Property design guidelines
答案 2 :(得分:0)
如果检查只是数字(类型),那么您的财产可以很好地处理类型安全。例如。用户无法将字符串分配给接受int的属性。
我建议如果Property涉及certaing计算,那么应该考虑使用一种方法。在这种情况下,您可以选择获得一些文本作为回报。
还有一个选项是将所有这些验证检查存储在实例集合中(在同一对象内)。等。
私人名单_faileValdations;
//更多代码
set
{
if (!IsNumber(value))
{
_faileValdations.Add("Invalid value for xxx. Expected... got..");
}
else{
id = value;
}
}
然后,您的GUI最终可以读取FailedValidations集合,并在某个标签中以格式化方式显示它。
编辑:下面还有一个选项。
您也可以使用事件驱动方法。 对象可以公开类似“ValidationFailed”的事件,并且所有GUI对象都可以订阅此事件。如果setter中的任何验证失败,该对象将触发此事件。
set {
if (!IsNumber(value))
{
RaiseValidationFailed("some message");
}
else{
id = value;
}
}
“RaiseValidationFailed”可以收集消息,将其包装在某些事件args中并使用消息触发“ValidationFailed”事件。然后GUI可以对此作出反应。 {如果不清楚,我可以为您提供完整的代码}
答案 3 :(得分:0)
我认为你应该重新考虑你的验证方法。您建议的方法意味着每次属性更改时,都会生成一条消息。
如何收集,存储和呈现这些消息?特别是如果你决定在网站上使用你的课程?
如果您想在其他任何时间验证课程该怎么办?
如果您想在客户端验证中使用相同的规则,该怎么办?
我可以理解尽早捕获无效值的吸引力,但在一次调用中验证整个类(如Validate()方法)要容易得多。这样,您就可以完全控制验证逻辑的运行时间。
我建议您阅读有关属性验证的两种主要方法:
Fluent Validation for >NET 3.0 and above
Fluent Validation for .NET 2.0
Data Annotations和FluentValidation都易于使用,并且能够在Web表单和win表单上生成经过良好测试的客户端验证。
在“数据注释”中,使用属性将验证添加到属性中。如果您希望将数据类保持为干净的数据传输对象,则Fluent验证涉及在Validator类中创建易于阅读的规则。