Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC-在ViewModel中验证是否足够?_C#_Asp.net Mvc_Validation - Fatal编程技术网

C# MVC-在ViewModel中验证是否足够?

C# MVC-在ViewModel中验证是否足够?,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,当我首先使用数据库时,我通过ViewModel验证我的输入。但是,这是否足以进行验证,或者是否有一些不成文的规则来添加它,例如在控制器中 另外,属性验证最常见的方法是什么,比如说密码 [Required] [StringLength(50)] [MinLength(3)] public string Password { get; set; } 这是一个很好的验证吗?属性验证非常适合它所能做的事情。除了您提到的验证属性外,还有EmailAddress属性,它将给定属性验证为电子邮件地址 [Em

当我首先使用数据库时,我通过ViewModel验证我的输入。但是,这是否足以进行验证,或者是否有一些不成文的规则来添加它,例如在控制器中

另外,属性验证最常见的方法是什么,比如说密码

[Required]
[StringLength(50)]
[MinLength(3)]
public string Password { get; set; }

这是一个很好的验证吗?

属性验证非常适合它所能做的事情。除了您提到的验证属性外,还有EmailAddress属性,它将给定属性验证为电子邮件地址

[EmailAddress(ErrorMessage = "Invalid Email Address")]
然后,您可以使用RegularExpression验证属性来执行更复杂的自定义验证:

[RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$", 
         ErrorMessage = "Characters are not allowed.")]
对于条件验证等,您可以将该逻辑添加到控制器中,并根据需要将错误添加到ModelState中

例如:

if (MyProperty == "something" && MyOtherProperty != "something")
{
    ModelState.AddModelError("", "MyOtherProperty needs to be something")
}
如果您不想在控制器逻辑中使用这样的样板验证代码,您可以编写自己的自定义验证属性。通过这样做,你几乎可以验证你能想到的任何东西

互联网上有很多关于这个话题的资源


举几个例子。

不要忘记通过调用ModelState.IsValid来检查ModelState的有效性。除此之外,我可以想象您需要进行一些额外的数据库验证检查。

我很乐意接受更正,但我相信这些属性将动态设置HTML,以便输入将设置
所需的属性。但我不记得它曾经为你做过服务器端检查。您可能还必须清理控制器中的数据,这从来都不是一个坏做法。@DrewKennedy啊,我明白了。关于在控制器中添加验证,您知道什么好的指南吗?虽然不是很好的指南,但您可以始终使用
ModelState
运行验证检查,使用
addmodeleror
定义每个问题,或使用属性定义错误消息。数据注释还将强制执行服务器端检查。将根据验证成功/失败情况更新
ModelState.IsValid
。至于密码验证,我想这取决于您希望密码的外观。MinLength 3?我是说3个字符的密码对我来说很糟糕。我想大概8个,也许10个。可能会强制执行一些规则,如包括数字、字母、符号等。我想说,
MinLength(3)
对于密码来说是非常弱的。例如,通过额外的数据库验证检查,您的意思是什么?假设有人注册了一个帐户。他输入的值可能是有效的,但是如果输入的用户名还没有被使用,您仍然需要在数据库中进行检查。啊,我明白了!我应该这样做吗?比如说一个
用户名
。如果
Username
已经存在于数据库中(仍然通过控制器),我将返回“已经存在”-错误。否则,将添加
用户名
。这样做正确吗?