#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