UserControl в шаблоне другого UserControl теряет значения при обратной передаче - PullRequest
1 голос
/ 27 января 2012

Это может быть действительно неправильный способ сделать это, и если это так, пожалуйста, дайте мне знать !!У меня есть пользовательский элемент управления с именем ucDropDownList.ascx.Это в основном выпадающий с кнопкой, кроме этого.При нажатии кнопки появляется диалоговое окно jquery.Диалог это проблема.Поскольку этот пользовательский элемент управления используется во многих местах, которые я хотел (в рамках принципов ООП), чтобы позволить нам загружать в другой форме, в зависимости от того, какой выпадающий список был ... Итак, я пошел на шаблон управления пользователями.Код для этого выглядит следующим образом:

public partial class ucDropDownList : System.Web.UI.UserControl

 {

   private ITemplate m_RecordForm = null;

   [TemplateContainer(typeof(cPopUpContainer))]
   [PersistenceMode(PersistenceMode.InnerProperty)]
   public ITemplate RecordForm
   {
     get { return m_RecordForm; }
     set { m_RecordForm = value; }
   }

   protected void Page_Load(object sender, EventArgs e)
   {

   }

   void Page_Init()
   {
     // Load in the Template control (we use this for making the different types of form!
     if (RecordForm != null)
     {
       cPopUpContainer container = new cPopUpContainer();
       m_RecordForm.InstantiateIn(container);
       phNewRecordForm.Controls.Add(container);
     }
   }

   public event EventHandler SaveClicked;
   protected void SaveButton_Clicked(object sender, EventArgs e)
   {
     if (SaveClicked != null)
       SaveClicked(this, e);
   }
 }

 public class cPopUpContainer: Control, INamingContainer
 {
   internal cPopUpContainer()
   {
   }
 }

Тогда у меня (будет) будет несколько пользовательских элементов управления, которые являются простыми формами для каждого из типов, для которых у меня будут эти пользовательские элементы управления для ... (пример приведентаблица состояния в базе данных).Там нет ничего захватывающего, просто у всех элементов управления есть ViewState Enabled.(в значительной степени как стандарт, как это происходит).

На странице, на которой я их показываю, есть какая-то разметка, например так ...

<uc3:ucDropDownList ID="comboStatus" runat="server" OnSaveClicked="comboStatus_Saved">
                    <RecordForm>
                        <uc4:ucEdStatus ID="ucEdStatus1" runat="server" ViewStateMode="Enabled" />
                    </RecordForm>
                </uc3:ucDropDownList>

и за кадром примерно так ...

  protected void Page_Init(object sender, EventArgs e)
  {
     if (!IsPostBack)
    {
      ucEdStatus statForm = comboStatus.Controls[3].Controls[0].FindControl("ucEdStatus1") as ucEdStatus;
      statForm.InitializeControl(false);
    }
   } 

  protected void Page_Load(object sender, EventArgs e)
  {

  }

  protected void comboStatus_Saved(object sender, EventArgs e)
  {
    ucEdStatus statForm = comboStatus.Controls[3].Controls[0].FindControl("ucEdStatus1") as ucEdStatus;
    statForm.SaveRecord(eSaveUCEdType.Insert);
  }

Когдазапускается SaveRecord (этот метод представляет собой простую вставку в базу данных, основанную на значениях различных элементов управления в элементе управления ucEdStatus1). Все элементы управления в ucEdStatus являются значениями по умолчанию, установленными в разметке, и не поддерживают то, что пользователь установил.в (поэтому сохранение просто сохраняет неправильный бит данных).

Я открыт для предложений и критики.Если вам нужна дополнительная информация, я могу дать ее вам, мне просто нужна помощь в понимании того, почему это происходит.

РЕДАКТИРОВАТЬ На всякий случай, если вы, ребята, задавались вопросом, это класс для элемента управления ucEdStatus.Это может ответить, почему я все еще чешу голову, или может показать, насколько я глуп.

long m_RecordID
{
  get { return (ViewState["recordid"] != null ? Convert.ToInt64(ViewState["recordid"]) : -1); }
  set { ViewState["recordid"] = value; }
}

bool m_isSupport
{
  get { return (ViewState["isSupport"] != null ? Convert.ToBoolean(ViewState["isSupport"]) : false); }
  set { ViewState["isSupport"] = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
}

//--------------------------------------------------------------------------------
public void InitializeControl(bool aIsSupport)
{
  //Setup the issupport variable
  m_isSupport = aIsSupport;

  //Add the importance to the mixup...
  Array importanceTexts = System.Enum.GetNames(typeof(eStatusImportance));

  for (int i = 0; i <= importanceTexts.Length - 1; i++)
  {
    ListItem item = new ListItem(importanceTexts.GetValue(i).ToString(), i.ToString());
    comboImportance.Items.Add(item);
  }
}

//--------------------------------------------------------------------------------
public long SaveRecord(eSaveUCEdType aSaveType)
{
  using (cDBConnection con = new cDBConnection(this.Page, true))
  {
    cStatus stat = new cStatus(con.Con, m_RecordID);
    if (m_RecordID == -1)
      stat.Id = cGlobalDB.NewKey();

    stat.Importance = Convert.ToInt32(comboImportance.SelectedValue);
    stat.Name = txtName.Text;
    stat.Issupport = m_isSupport;
    stat.Color = edColor.Color;
    stat.SaveChanges((aSaveType == eSaveUCEdType.Insert ? eUpdateType.insert : eUpdateType.update));
    return (long)stat.Id;
  }
}

Ответы [ 2 ]

0 голосов
/ 03 февраля 2012

Так что я нашел ответ после небольшого осмотра. Этот сайт действительно помог. Проблема заключалась в том, что модальное всплывающее окно jquery (диалоговое окно) теряло себя при ответе. Одна строка исправлена. Как расстраивает!

0 голосов
/ 27 января 2012

Попробуйте каждый раз инициализировать этот элемент управления в page_init; другими словами, снимите флажок !IsPostback. Все элементы управления должны быть инициализированы во время инициализации страницы, прежде чем будет применена их информация о состоянии просмотра. Это в точности эквивалентно определению элемента управления asp.net в файлах aspx / ascx (все, что находится в этих файлах, проходит через один и тот же процесс, автоматически для вас, выполняемый asp.net).

...