更好的方法来处理屏幕刮擦对象

时间:2009-10-12 15:09:55

标签: c# asp.net screen-scraping mvp

在我的应用程序中,我总是最终实现Model-View-Presenter模式,并且通常最终使用get属性从屏幕上删除我的View对象。

例如

Person IBasicRegistration.Person
{
 get
 {
  if (ViewState["View.Person"] == null)
   ViewState["View.Person"] = new Person();

  var Person = (Person) ViewState["View.Person"];

  Person.Email = txtEmail.Text.Trim();
  Person.FirstName = txtFirstName.Text.Trim();
  Person.LastName = txtLastName.Text.Trim();
  Person.Zip = txtZip.Text.Trim();
  Person.Phone = txtPhone.Text.Trim();
  Person.ResidentPersonLicenseState = 
        EnumerationParser.Parse<States?>(ddState.SelectedValue);

  return Person;
 }
}

然而,在调试过程中,我注意到当我在Presenter / Model中访问IBasicRegistration.Person时,我得到了很多关于get {}属性的遍历。

我开始认为这个模式看起来与INotifyPropertyChanged模式非常相似,我开始考虑实现一个类似的模式,并让每个文本字段实现一个OnChanged事件,该事件将更新它在视图状态中的person对象中的相关值。我进一步想到,每当一个人离开某个领域时,它需要大量的服务器请求,并且似乎在某些时候可能会导致可扩展性问题。

我的下一个想法是创建一个IsDirty标志并将我的代码包裹在接触类似于以下字段的字段中是有意义的:

Person IBasicRegistration.Person
{
 get
 {
  if (ViewState["View.Person"] == null)
   ViewState["View.Person"] = new Person();

  var Person = (Person) ViewState["View.Person"];

  if(IsDirty)
  {
      Person.Email = txtEmail.Text.Trim();
      ...others

      IsDirty = false;
  }

  return Person;
 }
}

并设置任何调用回发的方法(即通常只是提交按钮)来设置IsDirty = true然后它将无缘无故地重复大量工作。

有没有人为这项任务想出更优雅的东西?

1 个答案:

答案 0 :(得分:2)

我认为发生断开连接的地方通常是您在创建视图时实现视图。典型情况是表单实现视图接口,然后在应用程序对象中注册自身(或已注册)。然后,只要您需要查找为某人输入的内容,您就可以使用该视图的各种属性。

例如,要找出您为第一个名字输入的内容

 myVariable = PersonView.FirstName();

在您的示例中,每次访问人员时都会拉出视图的状态。即使您只是想要电子邮件,您也可以将所有内容都放入状态变量中。

现在,如果数据结构Person是模型的一部分。那可能没问题。更换时,您可以将人拉出一次。修改或添加到模型然后其他所有(报告等)将查看模型。

然而,你的问题表明它一次又一次被击中。这导致我认为出于各种原因直接从视图中访问Person。在这种情况下,我会在视图上放置属性,允许访问各个成员。

或者我会重构设计,以便所有内容都使用数据模型,每次视图更改时模型都会更新。我怀疑你可能不想在这一点上这样做,因此最好的方法是使用单独的属性。