【问题标题】:Model validation - Only validate user input fields?模型验证 - 仅验证用户输入字段?
【发布时间】:2013-02-12 14:20:22
【问题描述】:

我在这里迷路了。我知道如何使用验证,并且我目前在每个项目中都使用 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 等字段(在我的服务器端控制器上生成的字段?

【问题讨论】:

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


    【解决方案1】:

    您应该验证所有字段。众所周知,编码人员会犯错误,添加一些验证或断言语句会为您的软件按预期执行增加另一层保证。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2021-12-11
          • 2014-10-21
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-10
          相关资源
          最近更新 更多