Я работаю с динамическими полями в ASP.NET из-за очень специфических и жестких требований конечного пользователя, для объяснения которых потребуется 2 часа. Достаточно сказать, что я не могу отменить требование.
В любом случае, у меня есть рабочее решение; нет проблем с загрузкой элементов управления, рендерингом или поддержанием их ViewState. Вот как выглядит мой OnLoad:
public void override OnLoad(EventArgs e){
//don't need to check IsPostback, we have to load the controls on every POST
FormDefinition initialFormDefinition = ServiceLayer.GetFormDefinition(id);
BuildControls(initialFormDefinition);
}
Чтобы реализовать некоторую бизнес-логику, в соответствии с которой динамические поля являются обязательными, отключенными или необязательными, мне нужно получить опубликованные значения (например, ViewState) моих динамических элементов управления, прежде чем я смогу фактически добавить их в иерархию элементов управления страницы.
Я полагаю, это проблема курицы / яйца. ASP.NET не будет автоматически связывать ViewState с надлежащим динамическим элементом управления, пока я не добавлю их все на страницу. С другой стороны, я не могу добавить эти элементы управления на страницу, пока мой уровень обслуживания не применяет правила biz, которые зависят от их текущих значений. Я попытался обойти эту довольно неприятную проблему, написав такой фрагмент псевдокода:
public void override OnLoad(EventArgs e){
FormDefinition initialFormDefinition = ServiceLayer.GetFormDefinition(id);
BuildControls(initialFormDefinition);
if (IsPostBack){
PushControlValuesIntoForm(initialFormDefinition);
var updatedFormDefinition = ServiceLayer.ApplyBizRules(initialFormDefinition);
ReBuildControls(updatedFormDefinition); //remove controls and re-add them
}
}
К сожалению, когда вы очищаете элемент управления и повторно добавляете его, ViewState теряется, даже если тип элемента управления и ControlID одинаковы, поэтому это решение обанкротилось. Любые разумные идеи о том, как добиться того, чего я добиваюсь, приветствуются!