Веб-формы ASP.NET. Разумно ли вызывать пользовательский метод «Bind» в установщике свойств пользовательского элемента управления? - PullRequest
1 голос
/ 15 сентября 2009

Я не прикасался к веб-формам ASP.NET уже несколько лет, и мне немного не по себе.

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

У EditArticle есть свойство Article, которое отражает статью, которую можно редактировать.

Однако, когда я запускаю ссылку, щелкаю и передаю статью в свойство Article EditArticle и делаю ее видимой, метод Page_Load EditArticle вызывает исключение нулевой ссылки, когда пытается получить доступ к свойству Article. Таким образом, Page_Load, вероятно, вызывается до того, как установлено свойство?

Итак, я добавил что-то вроде этого в установщик свойств:

    public NewsArticle Article
    {
        get { return _article; }
        set { _article = value; 
              BindValues();}
    }

    protected void BindValues()
    {
        ArticleTitle.Text = Article.Title;
        ArticleSummary.Text = Article.Lead;
        TextEditor.Text = Article.Article;
    }

И это работает следующим образом: текстовые поля заполняются соответствующими данными, когда отображается элемент управления EditArticle.

Каков будет правильный и подходящий способ сделать это?

Ответы [ 3 ]

1 голос
/ 15 сентября 2009

Если вы ищете эмпирическое правило: «Создавайте объекты раньше, устанавливайте их свойства поздно (в жизненном цикле страницы)». Таким образом, родительская страница должна создавать объект рано (init, load) и задавать свойства дочерних элементов управления поздно (load page, pre render)

Я видел страницы, на которых все было втиснуто позже и позже в жизненный цикл страницы, пока все виды вещей не были в PreRender.

Полезно иметь под рукой диаграмму порядка событий, потому что часто чередование инициализации, загрузки и предварительного рендеринга главной страницы, страницы и пользовательских элементов управления может вызывать удивление.

1 голос
/ 15 сентября 2009

Вот ссылка на жизненный цикл страницы ASP.NET, которая даст вам более четкое представление о происходящем: Жизненный цикл страницы ASP.NET

В разделе События страницы вы можете видеть, что событие Load страницы вызывается и вызывает событие onload каждого элемента управления, который, в свою очередь, вызывает событие onload каждого из его дочерних элементов. Таким образом, в вашем случае вы, вероятно, делаете обратную передачу, и загрузка страницы увеличивается, затем увеличивается загрузка страницы пользовательского элемента управления (ваш пользовательский элемент управления взрывается), а затем запускается событие обратной передачи (где вы установили собственность).

Вы можете попытаться установить свойство на странице «Загрузка страницы» и получить его на странице «PreRender» пользовательского элемента управления. Еще одна вещь, которую вы можете попробовать, это иметь открытый метод в вашем пользовательском элементе управления, и вместо того, чтобы устанавливать свойство article, просто вызовите метод и передайте article как параметр.

0 голосов
/ 15 сентября 2009

Попробуйте оверите OnPreRender (). Вызывается позже, чем Page_Load.

...