Динамически созданные значения формы, сохраняющиеся после обратной передачи - PullRequest
0 голосов
/ 31 мая 2019

У меня есть usercontrol, который содержит динамически генерируемые веб-элементы управления (TextBox, DropDownList и т. Д.) *

Usercontrol загружается при определенных событиях нажатия кнопки.иногда события обратной передачи, которые должны быть обработаны (Button.OnClick и т. д.).

Чтобы учесть тот факт, что usercontrol загружается в событие click во время Page_Load () родителей usercontrol,Я повторно выполняю код, который загружает usercontrol.

IE - у меня, по сути, следующее:

public partial class parentPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        If(Page.IsPostBack)
        {
            // Conditions are usually here to make sure this only happens when I want it to
            userControl.LoadUserControl();
        }
    } 

    protected void Button_Click(object sender, EventArgs e)
    {
        userControl.LoadUserControl();
    }
}

public partial class userControl : System.Web.UI.UserControl
{
    public void LoadUserControl()
    {
        // Generate dynamic controls and bind events
    }

    protected void Button_Click(object sender, EventArgs e)
    {
        // Do stuff
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что после Button_Click() событие usercontrol обрабатывается, когда я в следующий раз нажимаю кнопку на родительском элементе, динамически сгенерированные поля usercontrol каким-то образом автоматически заполняются тем, что было до нажатия кнопки usercontrol - несмотря на то, что я явно настраиваюзначения при вызове функции LoadUserControl () во время нажатия кнопки родителяck.

Еще более странным является то, что заполненные поля не обязательно согласованы.В некоторых случаях текстовые поля имеют правильный текст, но DropDownLists имеют старый выбранный элемент.В других случаях DropDownLists выбираются правильно, но текстовые поля сохраняют старый текст.

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

** EDIT **

Возможно, немного понимания - если я установлю usercontrol в ViewStateMode = Disabled, кажется,решить проблему.Я не хочу этого делать, так как я действительно не уверен, повлияет ли это на другие функции.Я уже обнаружил несколько глюков с изменением, и у меня есть чувство, даже если я исправлю их, я в конечном итоге узнаю больше.Так что, надеюсь, любое решение не потребует таких кардинальных изменений.Возможно, тот факт, что он решает эту проблему, может помочь найти более элегантное решение?

** EDIT 2 **

Отладка с использованием dotPeek в рамках System.Web.UI.ControlCollection.Add () показывает, что после добавления элемента управления в коллекцию вызывается System.Web.UI.Control.AddedControl ().В конце , что , вызывается System.Web.UI.Control.LoadViewStateRecursive ().Именно там возникает проблема.Несмотря на то, что это динамически генерируемый элемент управления, он все еще сохраняется в ViewState.Продолжая копать ...

1 Ответ

0 голосов
/ 01 июня 2019

Хорошо!После двух дней отладки в глубоких темных недрах .NET Framework я наконец-то нашел решение.

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

Поскольку загрузка элементов управления происходит в Postback, я не мог пойти с простымопция if (! Page.IsPostBack), поэтому я использовал функцию, которую я уже написал, которая возвращает идентификатор элемента управления обратной передачи элемента управления, выполняющего обратную передачу.Если идентификатор совпадает с кнопками, которые, как я знаю, используются для начальной загрузки элементов управления, то при создании различных входных данных я устанавливаю их ViewStateMode на Disabled, а для бонусных баллов также устанавливаю EnableViewState на false.

Ключ в том, что когда эти элементы управления затем выполняют свои собственные обратные передачи (IE, DropDownList.SelectedIndexChanged, Button.Click и т. Д.), ViewStateMode для них включен - так что все работает правильно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...