Я разрабатываю приложение asp.net (3.5), и я озадачен поведением postbacks.Почему я теряю ссылки на объекты после обратной передачи?
Рассмотрите следующий сценарий: У меня есть пользовательский элемент управления, который в основном представляет собой форму. Однако каждое поле формы является элементом управления веб-пользователями.
В событии клика кнопки сохранения я повторяю все элементы управления в своей форме и получаю значение поля и имя поля, которое относится к полю базы данных, в котором я сохраняю значение.
Событие click инициирует обратную передачу, и во время обратной передачи я просматриваю элементы управления, и вот что смешно: значение свойства для поля базы данных стало нулевым! Может ли кто-нибудь пролить свет здесь?
Вот некоторые основные код:
[Serializable]
public partial class UserProfileForm : CustomIntranetWebappUserControl
{
protected override void OnInit(EventArgs e)
{
//AutoEventWireup is set to false
Load += Page_Load;
CancelLinkButton.Click += CancelButtonClickEvent;
SaveLinkButton.Click += SaveButtonClickEvent;
base.OnInit(e);
}
private void SaveButtonClickEvent(object sender, EventArgs e)
{
VisitFormFields();
}
private void VisitFormFields()
{
var userProfileVisitor = new UserProfileVisitor();
foreach (var control in Controls)
{
if (control is FormFieldUserControl)
{
var formField = (FormFieldUserControl) control;
formField.Visit(userProfileVisitor);
}
}
userProfileVisitor.Save();
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindText();
}
}
private void BindText()
{
LastNameFormLine.LabelText = string.Format("{0}:", HomePage.Localize("Last Name"));
LastNameFormLine.InputValue = UserProfile.LastName;
LastNameFormLine.IsMandatoryField = true;
LastNameFormLine.IsMultilineField = false;
LastNameFormLine.ProfileField = "UserProfile.LastName";
//... the rest of this method is exactly like the 4 lines above.
}
}
[Serializable]
public abstract class FormFieldUserControl : CustomIntranetWebappUserControl
{
public string ProfileField { get; set; }
public abstract void Visit(UserProfileVisitor userProfileVisitor);
}
[Serializable]
public partial class FormLineTextBox : FormFieldUserControl
{
//... irrelevant code removed...
public override void Visit(UserProfileVisitor userProfileVisitor)
{
if (userProfileVisitor == null)
{
Log.Error("UserProfileVisitor not defined for the field: " + ProfileField);
return;
}
userProfileVisitor.Visit(this);
}
}
[Serializable]
public class UserProfileVisitor
{
public void Visit(FormLineTextBox formLine)
{
// The value of formLine.ProfileField is null!!!
Log.Debug(string.Format("Saving form field type {1} with profile field [{0}] and value {2}", formLine.ProfileField, formLine.GetType().Name, formLine.InputValue));
}
// ... removing irrelevant code...
public void Save()
{
Log.Debug("Triggering the save operation...");
}
}
Я кодирую в .net с самого недавнего времени. Таким образом, я еще не знаю все о структуре. Однако, в отношении вашего ответа, я думал, что это была цель объекта viewstate ... – Pablo
См. Редактировать, как вы должны сохранять элементы для просмотра состояния. –