模型验证-仅验证用户输入字段

本文关键字:验证 输入 字段 用户 模型 | 更新日期: 2023-09-27 17:58:45

我在这里迷路了。我知道如何使用验证,目前我正在每个项目中使用FluentValidation。但每次创建新模型时都会出现一个问题-我应该只验证用户输入字段还是验证所有字段

示例

[Validator(typeof(ChatClientValidator))]
public class ChatClient
{
    public int ID { get; set; }
    public string IP { get; set; } // Generated on server
    public int ChatSessionID { get; set; }
    public virtual ChatSession ChatSession { get; set; }
    public string Name { get; set; } // Client field
    public string Email { get; set; } // Client Field
}
public class ChatClientValidator : AbstractValidator<ChatClient>
{
    public ChatClientValidator()
    {
        RuleFor(x => x.Name).NotEmpty().WithMessage("Name is required");
        RuleFor(x => x.Email).NotEmpty().WithMessage("E-Mail is required").EmailAddress().WithMessage("Enter correct E-Mail address");
    }
}

我是否应该验证IP、DateTime等字段(在服务器端控制器上生成的字段)?

模型验证-仅验证用户输入字段

您应该验证所有字段。众所周知,程序员会犯错误,添加一些验证或断言语句会为软件的预期性能增加另一层保证。

我喜欢在模型发布回服务器后验证处理所需的所有字段。这里的逻辑是,每个"ViewModel"类都可以被多个视图使用,然后每个视图将显示模型的不同方面,并更改表单上显示(和隐藏)的数据,更改返回的值。任何不在视图中的字段都会将null或某些无效值(String.Empty或0或DateTime.MinValue等)回发到控制器。

通过验证处理所需的字段,可以确保其他开发人员不会忘记添加必要的字段,而不用于处理的"只读"字段可以安全地回发为null。

例如:我经常添加List<SelectListItem>属性来包含关于下拉列表的信息,我可能不会验证这些信息,也不会验证您的示例中的ChatSession(假设它用于设置其他值可以被ChatSessionID取代,而ChatSession主要是为了方便/显示)。然而,我经常忘记为ID添加隐藏字段,所以我将它们标记为[必需],以确保它始终存在于我的回发中。

我会有一个视图模型,它是视图中字段的直接表示。我只会验证我的视图模型字段。当然,如果您还将更新后的视图模型映射到域实体,则会出现这种情况。

一旦验证了视图模型并映射到域实体,代码就会将域实体发送到其他层以更新数据库。

在映射视图模型之前,您会返回并从数据库中获取现有的域模型,并将更改后的视图模型字段映射到其中。

然后,您应该使用fluent验证或任何其他验证机制来验证整个域模型。

显然,如果您唯一的实体是视图模型,那么在它进入数据库之前,您需要验证其中的每个字段。