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

时间:2013-02-12 14:20:22

标签: c# asp.net-mvc validation model-view-controller asp.net-mvc-4

我很丢失。我知道如何使用验证,我目前正在每个项目上使用FluentValidation。但每次创建新模型时都会出现一个问题 - 我应该只验证用户输入字段还是所有字段? < / p>

实施例

[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等字段(在我的服务器端控制器上生成的字段吗?

3 个答案:

答案 0 :(得分:0)

您应该验证所有字段。众所周知,编码器会出错并添加一些验证或Assert语句会为您的软件按预期执行另一层保证。

答案 1 :(得分:0)

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

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

例如:我经常添加List<SelectListItem>属性以包含我可能无法验证的下拉信息,也不会验证示例中的ChatSession(假设它用于设置其他值可以由ChatSessionID替换,ChatSession主要用于方便/显示)。但是我经常忘记为ID添加隐藏字段,因此我将它们标记为[必需]以确保它始终存在于我的回发中。

答案 2 :(得分:0)

我会有一个视图模型,它直接表示您视图中的字段。 我只会验证我的视图模型字段。当然,这是因为您还将更新后的视图模型映射到域实体。

验证视图模型然后映射到域实体后,您的代码会将您的域实体发送到其他层以更新数据库。

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

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

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