哪个验证? Viewodel,Model,Html,jQuery还是全部?

时间:2015-10-06 07:48:51

标签: c# asp.net-mvc validation data-annotations

如您所知,Validation对于mvc网站非常重要。据我所知,你可以在四个级别进行验证。混乱从这里开始?我应该只使用 ViewModel验证,还是 ViewModel和模型验证,而不是 HTML属性,或者可能都是。使用所有验证方法会使代码变得复杂,难以阅读模型和视图模型,但却很可靠。仅使用viewmodel或模型验证会造成不安全。想象一下,您正在构建一个至少300 - 500个模型的项目,并查看模型。你的方法是什么?

HTML属性

<input type="text" required>

ViewModel数据注释

[Required(ErrorMessage="You must enter your name")]
public string Name {get; set;}

的jQuery

$("#someForm").validate()

模型验证&amp; DataAnnotations

[Required(ErrorMessage="ENTER YOUR NAME")]
public string Name {get;set;}

public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    //This is related to my architecture. Domain model inherits IValidateObject and overrides it. No big deal. This method raises when dbContext.SaveChange() method is in action
    if(Name.Length == "Admin")
    {
       yield return new ValidationResult("You can't use a reseved name.", new[] {"Name"});
    }
}

3 个答案:

答案 0 :(得分:1)

我建议进行客户端验证(HTML&amp; Javascipt)并验证存储在数据库中的实体。

HTML&amp; Javascipt验证为用户提供快速反馈,并在使用您的应用程序时改善用户体验。 您永远不应忘记,针对您网站的任何客户输入都是不安全的,您无法信任该数据。

也应该进行实体验证,因为如果你有另一个API,你必须确保数据库中没有存储无效数据。

答案 1 :(得分:1)

简单的答案是:

  

这取决于您的应用程序的布局方式以及代码将由谁使用和重用。

长答案可以是

客户端验证,查看模型验证,模型验证都可以在应用程序中的不同位置执行,并根据您使用/重用代码的方式提供特定用途。更多信息......

模型验证

我认为你的意思是对映射到服务层并发送到服务层进行处理的模型的验证?我现在假设是的......

如果您的服务层仅由单个应用程序(您的应用程序)使用,并且永远不会被其他应用程序或其他开发人员,Web / Windows服务或其他应用程序重用,那么您可能无法通过验证在您的服务层中,您可以完全依赖View模型验证来保护您的服务层。这是因为只有一个点可以传输数据并进入您的服务层。

但是,如果您的服务层将被其他应用程序重用或由其他开发人员使用,那么在那里执行验证检查会有帮助,因为这意味着您的服务层是防弹的,将为其他开发人员提供使用您的服务有效验证信息的方法。

请注意,如果您未在服务层中添加验证,并且您希望以后允许其他人使用验证,则需要通过并添加验证和这可能会在以后更加困难和耗时。您最好的选择是在您的服务层中建立验证。

查看模型验证

如果此时您已决定不在服务层中执行验证,或者您需要执行特定于一个或多个页面的验证,或者服务层验证没有进行验证。为您的应用程序用户生成友好的验证消息,然后您就会发现需要执行视图模型验证。

您如何执行View模型验证取决于您。我个人不会在Validate()的{​​{1}}方法中执行验证,因为it is only called when the validation attributes return no errors除非您使用custom model binder并且我希望将所有模型错误全部归还立刻。出于这个原因,如果有任何额外的验证超出了验证属性(或自定义验证属性)可以执行的限制,我倾向于在控制器中执行它,这将在某种程度上防止你的&# 39;难以阅读&#39;查看模型,这是一个例子:

IValidatableObject

客户端验证

这不是必需的,但它是一件好事,因为它可以通过使用客户端处理能力尽早执行验证来防止服务器上的不必要负载。但正如已经说过的那样 - 不能依赖它。它可以被禁用或规避,您的应用程序仍然可以被发布&#39;来自您申请之外的任何地方。

如果您不想过于努力,只需将不显眼的验证Nuget软件包安装到您的MVC项目中,并使用默认提供的验证属性并使用// Validate a field if (string.IsNullOrWhiteSpace(viewModel.Name)) { // Add a validation error this.ModelState.AddModelError("FieldName", "This is an error"); } if (this.ModelState.IsValid()) { // Do something... } 辅助方法你的意见。这将至少为您激活基本的客户端验证,但仅限于内置验证属性提供的范围。

答案 2 :(得分:0)

我更倾向于将ViewModel DataAnnotations用于客户端。这使事情变得简单,并且可以自定义。由于我无法完全信任/依赖客户端,因此我还会在控制器的操作(例如:ViewModel中验证if(ModelState.IsValid())以确保Model是在预期的有效状态下,没有人试图弄乱并强行张贴。