用于传递客户端可能无效的对象的首选技术

时间:2012-01-31 22:05:01

标签: c# .net vb.net winforms

我采用了一种技术,我将现有对象传递给表单,以便它们可以显示对象的内容,并允许用户在必要时更改它。表单没有绑定到对象,因此当需要采取行动时,表单会扫描其控件的内容并将其放入对象中。然后验证该对象并向用户报告任何问题。如果对象有效,则可以将其传递给调用者,以便调用者可以刷新视图/列表/等。

到目前为止,这么好。但是,如果表单的内容或缺少内容创建了无效对象而用户未对其进行更正,则可能取消该表单,表单可能会将无效对象交还给调用者。这不好。

基本上我正在寻找一种优雅而有效的方法,既可以让对象保持原样,也可以在用户取消表单/动作时回滚。

我考虑了一系列技巧,每项技巧都有很多优点和缺点。我很想考虑其他一些观点。

3 个答案:

答案 0 :(得分:0)

我的方法一直是:

验证整个ViewModel。如果验证,则提交更改。如果它没有验证:

  • 对于有效格式的条目,请在用户输入时将其保留
  • 如果表单中的条目无效,如果它与正确的格式匹配(例如,它是生日日期字段,但用户输入了1788年的日期),请返回该值,但将其标记为无效
  • 对于无效格式的条目,如果它与正确的格式不匹配(例如,它是年龄字段,但用户已输入X),则不返回任何值(将其设为空白)并将其标记为无效。

希望有所帮助

答案 1 :(得分:0)

你可以做例如

  • 向您的对象添加IsValid()方法,当表单关闭时,请检查包含有效对象

  • 在表单中添加一些state属性,该表单变为(例如booleanfalse,当表单关闭时,您可以检查该表单的状态。

只是例子。

答案 2 :(得分:0)

在过去,我通过在将对象传递给表单时制作对象的浅表副本来解决这个问题。然后,当副本返回时,您将验证它。如果它签出,您只需用副本覆盖原始对象。

  private static void PassTheObj()
  {
     MethodThatAcceptsObj(realObject.Copy());  
  }

  private static void ValidateObj(customObject objCopy)
  {
     if (objCopy.IsValid()) realObject = objCopy;
  }