应该在何处进行表单输入的类型转换 - 在验证之前,作为验证的一部分,还是其他?

时间:2011-10-21 18:22:03

标签: design-patterns validation type-conversion

我有一个HTML表单,用于收集文本字段中的一系列数字。

逻辑上我需要做以下事情,但我想不出一种方法来构建它是干净的:

  1. 从表单
  2. 中检索值
  3. 验证字符串是否仅包含数字
  4. 将值从字符串转换为实际数字
  5. 验证每个号码是否在允许的范围内
  6. 要么在我的validate方法中进行类型转换,要么输出类型错误,就像报告业务规则错误一样(这是我想要做的,因为从表单的角度来看,所有验证错误都需要报告同样的方式)。我不喜欢这样,因为在验证方法中更改值似乎是错误的。

    或者我有两种验证方法,第一种验证类型但没有变异数据,第二种验证方法假设类型正确且执行业务规则验证,两者之间的变异函数仅在类型验证通过时运行,并将字符串强制转换为数字。我喜欢分离,但这看起来有点复杂。

    对于这些选项中的任何一个,我都不是那么好。这个问题通常是如何解决的?

1 个答案:

答案 0 :(得分:1)

嗯......好问题。

如何使用FormDataMapping类从表单中获取字符串数据,将其转换为强类型数据,然后使用该数据初始化FormData类的新实例。 FormData类将无法以无效状态存在,因此构造函数将验证所有强类型值,并在任何值无效时抛出异常。

// Responsible for mapping string data to an actual FormData instance
public class FormDataMapper
{
    public FormData CreateFormData(string percentText)
    {
        float percent = float.Parse(percent);

        return new FormData(percent);
    }
}

// Responsible for always being in a valid state
public class FormData
{
    public Percent { get; private set; }

    public FormData(float percent)
    {
        if(percent < 0 || percent > 100)
        {
            throw new ArgumentInvalidException("Percent must be between 0 and 100", "percent");
        }

        this.Percent = percent;
    }
}

如果您计划进行实时javascript验证,那完全是另一个问题。您可以为此进行单独的验证阶段。请记住,技术上只是视图的实现。您告诉用户他们输入了无效数据这一事实与您的应用程序的验证逻辑没有任何关系。相反,这只是对用户的一种便利(现在是几乎所需的便利)。 :)