ASP.Net FindControl не работает - Каким образом?

Если вы создали приложение с --without orm, то вы в основном отключили любую функциональность ORM / модель / база данных, которую предлагают Waterline / Sails. Это означает, что вы не можете использовать концепцию моделей, описанную в Sails.

Вы всегда можете использовать другие методы, просто делайте это, как в любом другом проекте node.js. Требуйте модуль и следуйте их документации. Проверьте http://docs.sequelizejs.com/ на наличие одного из множества доступных вариантов.

И об использовании sails-mysql, это просто «адаптер» для Watermark, который сообщает вашему соединению, что вы хотите использовать «mysql». Но это доступно только тогда, когда в вашем приложении настроена ORM.

Если бы я разрабатывал приложение без ORM, я бы создал «сервисы», называемые тогда в контроллерах. То есть создайте свою бизнес-логику в /api/services (создайте папку, если она не существует), а затем разработайте там свое решение. Наконец позвоните им из ваших контроллеров. Вы можете проверить мой другой ответ здесь для примера

29
задан Gavin Miller 28 April 2009 в 20:35
поделиться

6 ответов

Вы, вероятно, используете MasterPage или пользовательские элементы управления (ascx), и это является причиной изменения идентификаторов клиентов. Представьте, что у вас есть элемент управления на главной странице с тем же идентификатором, что и на странице. Это приведет к столкновениям. Изменения идентификатора гарантируют, что все свойства ClientID являются уникальными на странице.

FindControl требует особого внимания при работе с MasterPages. Взгляните на ASP.NET 2.0 MasterPages и FindControl () . FindControl работает внутри контейнера имен . MastePage и страница - это разные контейнеры для именования.

29
ответ дан 28 November 2019 в 01:24
поделиться

I've had pretty good luck working around this problem in "most" cases with a simple extension method

You can call it on whatever higher-level container control you think best, including the Page itself if you want to scan the entire control hierarchy.

private static Control FindControlIterative(this Control control, string id)
{
    Control ctl = control;

    LinkedList<Control> controls = new LinkedList<Control>();

    while(ctl != null)
    {
        if(ctl.ID == id)
        {
            return ctl;
        }

        foreach(Control child in ctl.Controls)
        {
            if(child.ID == id)
            {
                return child;
            }

            if(child.HasControls())
            {
                controls.AddLast(child);
            }
        }

        ctl = controls.First.Value;
        controls.Remove(ctl);
    }

    return null;
}
8
ответ дан 28 November 2019 в 01:24
поделиться

При рендеринге html ASP.NET префиксирует все идентификаторы элементов управления с идентификаторами контейнеров именования (пользовательские элементы управления и т. Д.) В иерархии, возвращаясь назад к документу. корень. Это гарантирует, что все идентификаторы уникальны для постбэков и т. Д.

Это не влияет на использование FindControl, где вы должны использовать идентификатор в исходной разметке.

1
ответ дан 28 November 2019 в 01:24
поделиться

Вот ссылка на то, как называются элементы управления веб-форм ...

Идентификация элемента управления веб-формами

0
ответ дан 28 November 2019 в 01:24
поделиться

Вы можете написать Extender, чтобы найти любой элемент управления на странице, используя рекурсию. Это может быть в каком-то классе Util / Helper.

 public static Control FindAnyControl(this Page page, string controlId)
    {
        return FindControlRecursive(controlId, page.Form);
    }

    public static Control FindAnyControl(this UserControl control, string controlId)
    {
        return FindControlRecursive(controlId, control);
    }

    public static Control FindControlRecursive(string controlId, Control parent)
    {
        foreach (Control control in parent.Controls)
        {
            Control result = FindControlRecursive(controlId, control);
            if (result != null)
            {
                return result;
            }
        }
        return parent.FindControl(controlId);
    }
10
ответ дан 28 November 2019 в 01:24
поделиться

При поиске элемента управления в коллекции элементов управления всегда используйте идентификатор, который вы присвоили элементу управления, не тот, который вы видите в исходном рендере поста. Если FindControl () не находит элемент управления, о существовании которого вы знаете, велика вероятность того, что вы выполняете поиск не в правой ветви иерархии элементов управления. Рекурсивная функция для меня оказалась успешной.

Вот мой пример того, что я использую для VB.NET 3.5:

Function FindControlRecursive(ByVal ctrl As Control, ByVal id As String) As Control
    Dim c As Control = Nothing

    If ctrl.ID = id Then
        c = ctrl
    Else
        For Each childCtrl In ctrl.Controls
            Dim resCtrl As Control = FindControlRecursive(childCtrl, id)
            If resCtrl IsNot Nothing Then c = resCtrl
        Next
    End If

    Return c
End Function

Вот пример того, как я бы реализовал эту функцию в моем классе базовой страницы:

Dim form HtmlForm = CType(FindControlRecursive(Me, "Form"), HtmlForm)
7
ответ дан 28 November 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: