我是 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/