C# 如何在ASP.NET的UI上组织我的方法[设计问题]

C# 如何在ASP.NET的UI上组织我的方法[设计问题],c#,asp.net,design-patterns,architecture,webforms,C#,Asp.net,Design Patterns,Architecture,Webforms,首先,我知道它有点长。。但我只是想在这里说清楚。。提前感谢大家的建议:) 我已经花了3天的时间试图找出一个好的设计模式来组织我在web应用程序的UI层使用的方法。。而我却做不好 我所拥有的: 我的数据库中有19个表 19类每个类对应一个表,并且具有与该表的列对应的属性 19x2页。。前19页有适当的输入控件,允许我输入信息,通过类类型的对象发送,在表中创建新记录 第二个19页用于编辑表中的现有记录 我需要的是: 第一类页面(前19页)需要一些帮助方法(例如:重置控件、添加到b) 第二种类型

首先,我知道它有点长。。但我只是想在这里说清楚。。提前感谢大家的建议:)

我已经花了3天的时间试图找出一个好的设计模式来组织我在web应用程序的UI层使用的方法。。而我却做不好

我所拥有的:
  • 我的数据库中有19个表

  • 19类每个类对应一个表,并且具有与该表的列对应的属性

  • 19x2页。。前19页有适当的输入控件,允许我输入信息,通过类类型的对象发送,在表中创建新记录

  • 第二个19页用于编辑表中的现有记录

我需要的是:
  • 第一类页面(前19页)需要一些帮助方法(例如:重置控件、添加到b)

  • 第二种类型(其他19页)需要一些帮助方法(例如:确定要编辑的项目的id,更新数据库)

  • 最后是两种类型的页面之间通用的另一组方法

…我一直在使用接口来强制页面定义这些方法,并且用户可以为特定用途的方法提供参数方面的灵活性,这些方法是由我的19个页面组成的

附言:我不是很好,所以如果你有任何“首先你应该有……”或类似的建议,请随意说出你所看到的。我很高兴向您学习。

首先,您应该为每个类创建一个页面,该页面同时执行创建和更新。填充页面时,这两个操作之间的任何字段都可能不同。这将大大减少您必须维护的代码量。当向类中添加新的东西时,这也会使更改变得更容易,因为只需要在一个地方进行更改

这样做还可以解决如何放置帮助方法的问题

更新

创建一个有很多复杂状态的用户界面是很多人都有问题并且做得很糟糕的事情。然而,有一种简单的方法可以得到很好的结果

诀窍是将所有UI状态代码放在一个地方,并非常明确地说明是什么逻辑控制行为。切勿在多个位置设置可见或启用的属性(甚至文本属性)。这样一来,逻辑就清晰了,而且很容易改变

以下是一个例子:

private void UpdateUI()
{
    bool isNewRecord = (contact.ContactId == 0);

    statusLabel.Text = isNewRecord ? "Create New Contact" : "Edit " + contact.Name;
    nameTextBox.Visible = isNewRecord;

    bool isBusiness = contactTypeBusinessRadioButton.IsChecked;

    spouseCheckBox.Visible = !isBusiness;
    bool hasSpouse = !isBusiness & spouseCheckBox.IsChecked;

    spouseNameTextBox.Visible = hasSpouse;
}
然后,所有UI事件代码如下所示:

protected void spouseCheckBox_Click(object sender, EventArgs args)
{
    UpdateUI();
}
或者使用如下明确的状态控制:

protected void addPhoneButton_Click(object sender, EventArgs args)
{
    contact.Phones.Add(new Phone());
    UpdateUI();
}
同样,非常重要的是,对UI的所有数据读取/写入都发生在一个位置,而不管状态如何:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
         int contactId;
         if (int.TryParse(Request.QueryString["contactid"], out contactId))
             contact = Contact.Load(contactId);
         else
             contact = new ContactId();
         DisplayContact(contact);  // Only one method to display new or existing record.
    }
}

protected void saveButton_Click(object sender, EventArgs args)
{
    ReadContactFromPage(contact); // Only one method to read the screen.
    contact.Save();
}

显然,对于UI的复杂部分,例如开放式列表,可以将显示和输入代码分解为许多方法调用,但关键是,所有这些复杂性都可以从与页面事件交互的更高级别隐藏起来。

您可以创建一个其他人将从中继承的基本页面类。如果有可以重用的通用功能,那么这可能是一个很好的起点。不,如果您是直接编辑表,因为您有一个类似于每个类一个表的aproach,那么您可以使用一些框架或为更简单的表创建一个通用编辑功能


现在作为一个建议,不要过度使用更少的代码是更好的方法。漂亮干净易懂的代码更有价值

@Jeffrey。。事实上,我一开始确实考虑过这个问题,但它太复杂了,我无法实现。请看一下问题和答案:我不确定,但我会尽力告诉你结果。但是,如果您认为创建和更新的一页是一个重点,请您在回答我刚才提到的问题时补充一下您对如何实现它的一种好技术的想法。@IKashef-我已经更新了我的答案以解决您的问题。@Jeffrey。。这看起来不错,但有几点我不清楚:1。我是要在页面代码隐藏文件中定义方法UpdateUI(),还是在哪里?2.我知道UpdateUI()隐藏/显示控件以将UI调整到页面的当前状态(新建或更新),但为什么在单击复选框或添加电话时会调用它呢!在PageLoad事件中(在DisplayContact之前)被调用是否更有意义。。谢谢你的时间,很抱歉重播太晚了。我正在检查答案,以确保我得到了答案+1@IKashef-是的,它放在代码隐藏文件中。由于PageLoad事件发生在其他事件处理程序之前,因此UI更新需要在其他事件处理程序中发生。UI更新是对用户操作的响应。您不希望布局页面,然后将电话添加到联系人,因为这样页面布局就不会考虑新电话。@IKashef-如果您计划在代码库中操作页面,界面可能会很有用。例如,如果一组页面包含完全相同的复杂逻辑(围绕某个公共数据段)。然而,我不希望出现这种情况。自定义控件是解决常见复杂逻辑问题的更好方法。我想不出在这种情况下会使用什么样的接口,不必要的东西应该忽略不计。但是,如果您想在库中操作页面,那么最好使用一个接口。。关于不要过度使用代码更少的方法的建议,我会考虑到这一点。至于你关于基本页面的建议,这不是我第一次在回答中听到它,但实际上我对它没有任何经验或知识,除了我知道它是一个从System.Web.UI.page和I.le继承的抽象类之外