MVC/MVP中的验证

The*_*ing 7 c# model-view-controller mvp winforms

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

我在某种程度上创建了模型,演示者和视图......现在我的验证适合哪里.

我认为初始数据类型验证(只有Age字段中的数字)应该通过视图完成.而其他验证(如年龄是否在200以内)应该由模型完成.

关于数据类型验证,我的视图将值公开为属性

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

我可以单独执行验证,但是当它尝试访问属性Age?时,如何通知演示者验证仍处于待处理状态?特别是当该领域是可选的.

抛出一个验证暂停异常是好的,但是演示者必须在每个点都捕获它.

我的理解是正确的,还是我错过了什么.

更新(为了清楚起见): 在这个简单的情况下,年龄字段是可选的,当用户键入他的名字而不是数字时我该怎么办.我无法传递null,因为这意味着该字段已被用户留空.那么如何通知演示者输入的数据无效...

Fin*_*las 1

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

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

想象一下,如果我将您的视图切换到 ASP.NET MVC 前端。我不会说控件,因此需要某种形式的客户端脚本。我要表达的观点是,您需要编写的唯一代码是针对视图的 - 也就是说,不要尝试跨视图推广 UI 验证,因为这会违背分离您的关注点的目的。

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