我在数据库中有整数类型字段,其属性为“Not Null”。
当我创建一个视图&进行验证,如果我将该字段留空,则将其视为0,因此我无法将其与0进行比较,因为如果有人插入值0则会将其视为错误!
另一个问题是我正在使用模型错误,如“ASP.NET MVC 1.0”@ Scott Gu博客中所述。我正在检查部分对象类(由LINQ-To-SQL创建)中的值。即
public partial class Person
{
public bool IsValid
{
get { return (GetRuleViolations().Count() == 0); }
}
public IEnumerable<RuleViolation> GetRuleViolations()
{
if (String.IsNullOrEmpty(Name))
yield return new RuleViolation("Name is Required", "Name");
if (Age == 0)
yield return new RuleViolation("Age is Required", "Age");
yield break;
}
partial void OnValidate(ChangeAction action)
{
if (!IsValid)
throw new ApplicationException("Rule violations prevent saving");
}
}
范围也有问题。
就像在数据库中一样,如果我声明为smallint,即c#中的short,现在如果我超出该范围,那么它会给出错误,因为“需要一个值”。
所以最终有没有最好的ASP.NET MVC验证方法?
答案 0 :(得分:1)
您可以使用可空类型更改代码吗?
Dim i As Nullable(Of Integer)
MsgBox(i.HasValue)
'result is false
i = 1
MsgBox(i.HasValue)
'result is true
i = Nothing
MsgBox(i.HasValue)
'result is false
答案 1 :(得分:0)
我不是很了解MVC的细节,但是有没有办法将age的默认值更改为-1?通过这种方式,您可以查看值,人们仍然可以输入0。
另一种解决方案可能是使用可空的int。你可以通过添加一个?到了类型。
HTH。
乔纳森
答案 2 :(得分:0)
我会先在客户端验证表单。如果年龄为0,则让用户知道它不是有效年龄。在服务器上更改消息,这是误导性的:
if (Age == 0)
yield return new RuleViolation("0 years is not a valid age", "Age");
我知道,因为你从Person
实体绑定到一个模型属性,它将0作为默认值 - 为什么你不在数据库中更改它?将数据库中的默认值设置为您认为对用户年龄合理的值,以便新实体不再显示为0.
如果您不想更改db值,请在加载时使用jQuery将文本框值设置为“创建”页面上的空字符串。如果用户尝试提交此类表单,您可以在客户端上检查以禁止它,并且在服务器上您不必执行任何操作,用户将收到“需要A值”消息。
顺便说一下,你写道:
我无法将其与0进行比较,因为如果 有人插入一个值0然后它会 被视为错误
我没有在这个特定的域模型中看到问题。你认为0岁是不是一个好的价值?问问自己。
答案 3 :(得分:0)
使用Utilities.GetNullableInt32(textbox1.Text.Trim());
如果您使用此GetNullableInt32()
函数检查,如果用户输入值“0”,则会在表格中保存为NUll