- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们正试图找出在业务逻辑或模型中执行验证的 mvvm 中的验证。我已经在我们的业务逻辑中实现了通过异常类型进行验证 - 可以在此处找到简化图:
如果我们有很多彼此独立的输入,没有问题,抛出异常,文本框捕获它并标记每个错误输入的边框为红色。然而,当我们有依赖值时,我们就有麻烦了。例如
模型中的 Value1 和 Value2 不能相同,因此我们在每个寻找相等值的对象中都有一个验证函数,如果发生这种情况则抛出异常
现在,如果我们将 Value1 设置为 0 并将 Value2 设置为 1,一切都很好
Value1 在 GUI 中被设置为 1 --> 这个被标记为红色,因为没有触发其他值的验证,所以 GUI 中的 Value2 没有被标记为错误
Value2 在 GUI 中设置为 2,现在我们已达到有效状态,但只有 Value2 得到验证,因此 Value1 仍被标记为错误
是否有解决该问题的通用模式?我们不想在两个文本框之间的 GUI 中引入依赖关系,因为该逻辑应该只出现在业务逻辑层中。
除了实现异常验证之外,还可以实现 IDataErrorInfo 接口(interface),但问题仍然存在,没有办法强制依赖值再次验证它们的值,至少我看不到:)
感谢任何帮助
干杯, 曼尼
[清理,删除不必要的步骤]
15.11.2010 - 第 2 部分
好吧,在这里重新考虑一下,我们将使用业务逻辑层。这是我们目前计划的配置: (图片在这里有点小,请在单独的窗口打开它以显示全尺寸)一切都或多或少很清楚,除了如果业务逻辑下的数据模型发生更改,如何通知不同编辑器的所有 View 模型/模型克隆。一种方法是在创建它们的业务逻辑中跟踪克隆的模型。当使用业务逻辑 commit() 更改数据模型时,可以将更改通知所有其他已注册模型克隆并进一步传播它们。或者,业务逻辑可以发布一个所有 View 模型都订阅的事件,以便它们也能获得更改 - 谁能给我一个更好的提示?
再次感谢您的帮助,抱歉我脑子有问题;)
最佳答案
您可以考虑使用 System.ComponentModel.IDataErrorInfo界面。这个非常方便的界面使您能够:
您在您的 View 模型上实现 IDataErrorInfo(或者甚至在您的 View 模型库中虚拟地实现 IDataErrorInfo,并在您的派生 View 模型中覆盖它)。由于数据绑定(bind)的性质,我需要检查的值都在 View 模型中,我可以测试它们的任意组合。当然,您仍然在业务层进行验证,但您不再需要为了进行一些验证而前往业务层(或模型)。
这是一个来自 (WPF) 屏幕的简单示例,它收集一些用户详细信息并对它们进行基本验证:
C#代码:
#region IDataErrorInfo Members
/// <summary>
/// Gets an error message indicating what is wrong with this object.
/// </summary>
/// <value></value>
/// <returns>An error message indicating what is wrong with this object. The default is an empty string ("").</returns>
public override string Error
{
get
{
return this["UserCode"] + this["UserName"] + this["Password"] + this["ConfirmedPassword"] + this["EmailAddress"];
}
}
/// <summary>
/// Gets the <see cref="System.String"/> with the specified column name.
/// </summary>
/// <value></value>
public override string this[string columnName]
{
get
{
switch (columnName)
{
case "UserCode":
if (!string.IsNullOrEmpty(UserCode) && UserCode.Length > 20)
return "User Code must be less than or equal to 20 characters";
break;
case "UserName":
if (!string.IsNullOrEmpty(UserCode) && UserCode.Length > 60)
return "User Name must be less than or equal to 60 characters";
break;
case "Password":
if (!string.IsNullOrEmpty(Password) && Password.Length > 60)
return "Password must be less than or equal to 60 characters";
break;
case "ConfirmedPassword":
if (Password != ConfirmedPassword)
return Properties.Resources.ErrorMessage_Password_ConfirmedPasswordDoesntMatch;
break;
case "EmailAddress":
if (!string.IsNullOrEmpty(EmailAddress))
{
var r = new Regex(_emailRegex);
if (!r.IsMatch(EmailAddress))
return Properties.Resources.ErrorMessage_Email_InvalidEmailFormat;
}
break;
}
return string.Empty;
}
}
#endregion
这是页面上两个文本框的 XAML 标记(特别注意 Text
绑定(bind)中的 ValidatesOnDataErrors
和 ValidatesOnExceptions
属性):
<TextBox Name="UserCodeTextBox"
Text="{Binding UserCode,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}"
GotFocus="Input_GotFocus"
VerticalAlignment="Top"
Margin="165,0,150,0"
CharacterCasing="Upper"
/>
<TextBox Name="UserNameTextBox"
Text="{Binding UserName,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}"
GotFocus="Input_GotFocus"
VerticalAlignment="Top"
Margin="165,30,0,0"
/>
关于c# - MVVM - 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4152346/
在 JSF2 应用程序中遇到验证属性的问题时,有两种主要方法。 使用 Annotation 在 ManagedBean 上定义验证 @ManagedBean public class MyBean {
我想实现一个不常见的功能,我认为 jquery 验证插件将是最好的方法(如果您在没有插件的情况下建议和回答,我们也会欢迎)。我想在用户在输入字段中输入正确的单词后立即隐藏表单。我试过这个: $("
我有几个下拉菜单(类名为month_dropdown),并且下拉菜单的数量不是恒定的。我怎样才能为它们实现 NotEqual 验证。我正在使用 jQuery 验证插件。 这就是我写的 - jQuery
我设法制作了这个网址验证代码并且它起作用了。但我面临着一个问题。我认为 stackoverflow 是获得解决方案的最佳场所。 function url_followers(){ var url=do
我目前正在使用后端服务,该服务允许用户在客户端应用程序上使用 Google Games 库登录。 用户可以通过他们的 gplay ID 向我们发送信息,以便登录或恢复旧帐户。用户向我们发送以下内容,包
我正在尝试验证输入以查看它是否是有效的 IP 地址(可能是部分地址)。 可接受的输入:172、172.112、172.112.113、172.112.113.114 Not Acceptable 输入
我从 Mongoose 验证中得到这条消息: 'Validator failed for path phone with value ``' 这不应该发生,因为不需要电话。 这是我的模型架构: var
我一直在尝试使用Python-LDAP (版本 2.4.19)在 MacOS X 10.9.5 和 Python 2.7.9 下 我想在调用 .start_tls_s() 后验证与给定 LDAP 服务
我正在处理一个仅与 IE6 兼容的旧 javascript 项目(抱歉...),我想仅在 VS 2017 中禁用此项目的 ESLint/CSLint/Javascript 验证/CSS 验证。 我知道
我正在寻找一种方法来验证 Spring 命令 bean 中的 java.lang.Double 字段的最大值和最小值(一个值必须位于给定的值范围之间),例如, public final class W
我正在尝试在 springfuse(JavaEE 6 + Spring Framework (针对 Jetty、Tomcat、JBoss 等)) 和 maven 的帮助下构建我的 webapps 工作
我试图在我们的项目中使用 scalaz 验证,但遇到了以下情况: def rate(username: String, params: Map[String, String]): Validation
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
我有一个表单,人们可以单击并向表单添加字段,并且我需要让它在单击时验证这些字段中的值。 假设我单击它两次并获取 2 个独立的字段集,我需要旋转 % 以确保它在保存时等于 100。 我已放入此函数以使其
在我的页面中有一个选项可以创建新的日期字段输入框。用户可以根据需要创建尽可能多的“截止日期”和“起始日期”框。就像, 日期_to1 || date_from1 日期到2 ||日期_from2 date
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
有没有办法在动态字段上使用 jquery 验证表单。 我想将其设置为必填字段 我正在使用 Jsp 动态创建表单字段。 喜欢 等等...... 我想使用必需的表单字段验证此表单字段。 最佳答
嗨,任何人都可以通过提供 JavaScript 代码来帮助我验证用户名文本框不应包含数字,它只能包含一个字符。 最佳答案 使用正则表达式: (\d)+ 如果找到匹配项,则字符串中就有一个数字。 关于J
我有两个输入字段holidayDate和Description(id=tags) $(document).ready(function() {
我遇到了这个问题,这些验证从电子邮件验证部分开始就停止工作。 我只是不明白为什么即使经过几天的观察,只是想知道是否有人可以在这里指出我的错误? Javascript部分: function valid
我是一名优秀的程序员,十分优秀!