«Во-первых, вы должны были» создать отдельную страницу для каждого класса, которая выполняет как создание, так и обновление. Независимо от того, какие поля отличаются между этими двумя операциями, они могут быть разными при заполнении страницы. Это значительно сократит объем кода, который вы должны поддерживать. Это также облегчит добавление новых вещей в классы, потому что изменения нужно будет вносить только в одном месте.
Выполнение этого также решит вопрос о том, куда поместить вспомогательные методы.
UPDATE
Создание пользовательского интерфейса с большим количеством сложных состояний - это то, с чем у многих людей возникают проблемы, и они плохо справляются. Однако есть простой способ сделать это, который даст хорошие результаты.
Хитрость заключается в том, чтобы поместить весь код состояния пользовательского интерфейса в одно место и четко определить, какая логика управляет поведением. Никогда не устанавливайте свойство Visible или Enabled (или даже свойство Text) более чем в одном месте. Таким образом, логика понятна и может быть легко изменена.
Вот пример:
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;
}
Тогда весь ваш код события пользовательского интерфейса выглядит следующим образом:
protected void spouseCheckBox_Click(object sender, EventArgs args)
{
UpdateUI();
}
Или с каким-то явным контролем состояния, например:
protected void addPhoneButton_Click(object sender, EventArgs args)
{
contact.Phones.Add(new Phone());
UpdateUI();
}
Точно так же очень важно, чтобы все данные считывания / записи в пользовательском интерфейсе происходили в одном месте, независимо от состояния:
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();
}
Очевидно, что для сложных частей пользовательского интерфейса, таких как открытые списки вещей, дисплей и входной код могут быть учтены во многих вызовах методов, но главное, чтобы вся эта сложность была скрыта от более высоких уровней которые взаимодействуют с событиями страницы.