c# - MVC/MVP 中的验证

标签 c# winforms model-view-controller mvp

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

我已经在某种程度上创建了模型、演示者和 View ......现在我的验证适合哪里。

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

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

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

我可以单独执行验证,但是当演示者尝试访问属性 Age 时,我如何通知演示者验证仍在进行中?。特别是当该字段是可选的时。

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

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

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

最佳答案

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

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

想象一下,如果我将您的 View 切换到 ASP.NET MVC 前端。我不会说控件,因此需要某种形式的客户端脚本。我要说的是,您唯一需要为 View 编写的代码 - 即不要尝试将 UI 验证概括为跨 View ,因为这会破坏分离关注点的目的。

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

关于c# - MVC/MVP 中的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4013989/

相关文章:

c# - 不要让反序列化的json(jsonnet)被查看

c# - Mono 2.11.X 发生了什么?

c# - 在 WinForms 上使用 TPL 进行并行编程

c# - ComboBox.SelectedValue 不工作

javascript - 跟踪 View 状态信息的推荐方法是什么?

wpf - WPF 的 MVC(不是 mvvm)?

javascript - knockout : Accessing property of observable object

c# - 如何使用 ADO.Net C# 将 null 插入到 sql 数据库中

c# - 是否可以在不使用 FromQuery 的情况下在 Swagger UI 中为输入模型属性赋予不同的名称?

c# - 如何设置 TcpClient 的超时时间?