ASP.NET пользовательский элемент управления для кратковременной памяти

#c# #.net #asp.net

#c# #.net #asp.net

Вопрос:

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

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

 <custom:EditFieldControl ID="EditFieldControl" 
    runat="server" 
    ElementId='<%#Eval("Id")%>'                                                       
    ElementValue='<%#Eval("Value")%>' 
    ElementFormat='<%#Eval("Format")%>' 
    Visible="false" />
  

Код управления, лежащий в основе, выглядит следующим образом:

 public class EditFieldControl : WebControl
{ 
    private TextBox textBox;
    private DropDownList dropDownList;    

    protected override void CreateChildControls()
    {
        switch (The Format of the field)
        {
            case "Text":
            {
                textBox = new TextBox
                {
                    Text = The existing value,
                    CssClass = "FieldTextBox"
                };
                this.Controls.Add(textBox);
                break;               
            }
            case "DropDownList":
            {
                dropDownList = new DropDownList
                {
                    //go get possible values from the database
                    CssClass = "FieldDropDown"
                };
                this.Controls.Add(dropDownList);
                break;
            }
            default:
                throw new ArgumentException("Invalid Format Type");
        }
        base.CreateChildControls();
    }

    public string Value
    {
        get
        {
            switch (ElementFormat)
            {
                case "DropDownList":
                    return dropDownList.SelectedValue;
                default:
                    return textBox.Text;
            }
        }
    }
}
  

Проблема в том, что при нажатии кнопки «сохранить это поле» сервер ищет EditFieldControl в этом бите повторителя, находит его, а затем вызывает метод value, который немедленно выдает ошибку, поскольку он пытается получить доступ либо к текстовому полю, либо к выпадающему списку, которые больше не существуют. Мой вопрос в том, как мне получить значение, которое пользователь ввел / выбрал? Я предполагаю, что мне придется воссоздать элемент управления ранее в жизненном цикле, я просто не уверен, когда.

Комментарии:

1. Динамически созданные серверные элементы управления должны быть воссозданы (обычно в Page_Load) для повторного заполнения их состояний и доступа к их «истинным» значениям.

2. @El: Page_Load это худшее место для чего-либо. OnInit намного лучше

3. И обычно вам нужно заново выполнить привязку данных. Это одна из плохих частей ViewState, и Asp.Net Веб-формы в целом и одна из главных причин, по которой люди переходят на MVC framework.

4. @abatishchev лол, хорошо. Да, у меня были проблемы с подпрограммами в Page_Load . Есть ли какие-то особые причины, по которым Page_Load это так плохо?

5. Как и было рекомендовано, вместо этого я переместил код в событие PageLoad. Теперь элемент управления правильно сконструирован к моменту, когда необходимо выполнить поиск значения, и viewstate волшебным образом сохранил все значения. Я попытался поместить конструкцию в Init, однако свойства элемента управления не были назначены в этот момент, и поэтому формат поля по-прежнему равен null, следовательно, была выдана ошибка.

Ответ №1:

Asp: Repeater не является идеальным элементом управления для редактирования данных, он больше используется для отображения. Для редактирования подходят FormView, DetailsView, а лучшим в вашем случае, вероятно, является элемент управления ListView. Вы можете определить отдельные шаблоны для отображения (ItemTemplate), редактирования (EditItemTemplate) и вставки (InsertItemTemplate). Свойству Value необходим установщик, позволяющий осуществлять двустороннюю привязку. Используйте Bind вместо Eval.

Надеюсь, это поможет.

Ответ №2:

Как и было рекомендовано, вместо этого я переместил код в событие PageLoad. Теперь элемент управления правильно сконструирован к моменту, когда необходимо выполнить поиск значения, и viewstate волшебным образом сохранил все значения.

Я попытался поместить конструкцию в Init, однако свойства элемента управления не были назначены в этот момент, и поэтому формат поля по-прежнему равен null, следовательно, была выдана ошибка.

Комментарии:

1. Эта схема полезна: blog.krisvandermast.com/ASPNET20PageLifeCycle.aspx . Также этот документ: msdn.microsoft.com/en-us/library/ms178472.aspx