代码之家  ›  专栏  ›  技术社区  ›  The King

MVC/MVP中的验证

  •  7
  • The King  · 技术社区  · 14 年前

    我是MVC/MVP新手,通过创建Winform应用程序来学习它。

    我认为初始数据类型验证(像Age字段中的数字一样)应该由view完成。而其他的验证(比如年龄是否在200岁以内)则应该通过模型来完成。

    public int? Age 
    { 
        get 
        { 
            int val; 
            if (Int32.TryParse(TbxAge.Text, out val))
            { 
                return val; 
            } 
            return null; 
        } 
        set 
        { 
            TbxAge.Text = value; 
        } 
    } 
    

    我可以单独执行验证,但是当演示者试图访问属性年龄时,我如何通知演示者验证仍处于挂起状态?。尤其是当字段是可选的时。

    抛出validationpending异常好吗,但是演示者必须在每一点捕获它。

    我的理解是正确的,还是我遗漏了什么。

    更新(为了清楚起见): 在这个简单的例子中,age字段是可选的,当用户键入他的名字而不是数字时,我应该怎么做。 我不能传递空值,因为这意味着该字段已被用户保留为空。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Finglas    14 年前

    从MVP的角度来看(我相信它更适合WinForms),你的问题的答案是有争议的。然而,我理解的关键是,在任何时候你都应该能够改变你的观点。也就是说,我应该能够提供一个新的WinForms视图来显示您的应用程序,或者将它挂接到一个ASP.NET MVC前端。

    一旦你意识到这一点,验证就变得很快了。应用程序本身(业务逻辑)应该抛出异常、处理错误等等。UI逻辑应该是哑的。换句话说,对于WinForms视图,应该确保字段不为空,以此类推。很多控件的属性都允许这样做-Visual Studio的属性面板。在GUI中对抛出异常之类的代码进行验证是一个大问题。如果要在视图和模型上都进行验证,则需要复制代码—您所需要的只是一些简单的验证,例如控件不是空的。让实际的应用程序本身执行实际的验证。

    核心应用程序应该包含所有逻辑。指定的视图逻辑(WinForms属性、Javascript等等)应该是每个视图唯一的。在我看来,拥有每个视图必须验证的属性和接口是错误的。

        2
  •  0
  •   Nicole Calinoiu    14 年前

    如果您的“视图将值公开为属性”,我怀疑您遗漏了一些内容。MVP/MVC与其他一些UI分离模式的主要区别在于,它们包括一个模型,该模型旨在成为视图、演示者或控制器共享数据的主要容器。

    如果您将模型用作数据容器,那么验证的责任就变得非常明确。由于只有演示者(或控制器)实际上除了显示数据之外还执行其他操作,因此它负责验证数据是否处于其将要执行的操作的可接受状态。

    在编辑期间将数据验证问题的可视指示器添加到编辑器窗体/窗口当然很好。然而,它应该被认为或多或少等同于视图“眼睛糖果”,并且应该被视为真实验证逻辑的附加组件(即使它基于共享元数据或代码)。演示者(或控制器)应保持数据有效性的真正权威,其验证代码不应托管在视图中。

        3
  •  -1
  •   David Mårtensson    14 年前

    我相信视图验证只与javascript相关,因为视图不会在post上运行任何代码,只有控制器会运行。

    不过,视图可能有方法显示任何错误。