DropDownList ASP.NET 4.0 в качестве параметра выбора - минимизация запросов, отправляемых в базу данных

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

База данных, над которой я работаю, содержит небольшую таблицу всего с 6 строками и 5 полями. Он действительно требует функциональности CRUD, поскольку время от времени он будет меняться, но почти наверняка никогда не будет расширяться за пределы дюжины строк.

Веб-приложение ASP.NET имеет бизнес-логику и уровень доступа к данным.

Я хотел бы иметь dropDownList в качестве элемента управления псевдо «разбиения на страницы», чтобы выбрать, какую строку отображать в DetailsView.

Быстрое и неприятное решение - поместить в ASP 2 элемента управления objectDataSource, один с параметром select:

<asp:ObjectDataSource ID="DDDataSource" runat="server" TypeName="PICUdrugs.BLL.referenceBL"
SelectMethod="getReferences"/>
<asp:DropDownList ID="RefAbrevDDL" runat="server" AutoPostBack="True" 
    DataTextField="abbrev" DataSourceID="DDDataSource" 
    DataValueField="drugReferenceID" ViewStateMode="Enabled" >
</asp:DropDownList>

<asp:ObjectDataSource ID="SelRefObjDataSrc" runat="server" SelectMethod="getReferences"
UpdateMethod="updateReference" DeleteMethod="deleteReference" TypeName="PICUdrugs.BLL.referenceBL"
OnUpdated="reference_CRUD" DataObjectTypeName="PICUdrugs.DAL.drugReference" 
ConflictDetection="CompareAllValues" OldValuesParameterFormatString="orig{0}">
    <SelectParameters>
        <asp:controlparameter name="refID" controlid="RefAbrevDDL" propertyname="SelectedValue"/>
    </SelectParameters>
</asp:ObjectDataSource>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" />
<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataSourceID="SelRefObjDataSrc"
    CssClass="DetailView">
    <Fields>
        <asp:DynamicField DataField="referenceDescription" HeaderText="Reference Description" />
        .....[remaining fields].....

Хотя это работает, меня беспокоит, что я дважды запрашиваю в базе данных подобную информацию. Существуют ли какие-либо эффективные / изящные решения для использования преимущества objectDataSource (т.е. отсутствие необходимости писать конкретные обработчики событий для detailsView), но создание перечисляемого списка для одного запроса к базе данных и обеспечение доступа обоих элементов управления к одному и тому же объекту (? Используйте подробностиПросмотреть элемент управления подкачкой?)? код позади - С #, но vb в порядке, если у кого-то есть примеры / ссылки.

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


person Brent    schedule 05.05.2012    source источник


Ответы (1)


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

в файле кода для веб-страницы настройте частную переменную, чтобы ссылка на объект бизнес-уровня сохранялась в течение цикла сборки страницы, и настройте создание объекта и созданные обработчики событий:

    private referenceBL persistentRef;
    protected void DDDataSource_ObjCreated(object sender, ObjectDataSourceEventArgs e)
    {
        persistentRef = e.ObjectInstance as referenceBL;
    }
    protected void SelRefObjDataSrc_ObjCreating(object sender, ObjectDataSourceEventArgs e)
    {
        if (persistentRef!=null)
        {
            e.ObjectInstance = persistentRef;
        }
    }

на уровне бизнеса иметь частную переменную, указывающую на тот же перечислимый список, который используется первым источником данных объекта, и обрабатывать выбор следующим образом:

    private IEnumerable<drugReference> persistingRef;
    public IEnumerable<drugReference> getReferences()
    {
        persistingRef = DrugRefRepository.getReferences();
        return persistingRef;
    }
    public IEnumerable<drugReference> getReferences(int refID)
    {
        if (persistingRef == null)
        {
            return DAL.DrugRefRepository.getReferences(refID); //data access layer method
        }
        else
        {
            return persistingRef.Where(r => r.drugReferenceID==refID);
        }
    }

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

Я надеюсь применить ту же стратегию к вложенному (встроенному) objectDataSource в listView, чтобы функциональность обновления и удаления существовала, но минимизировала количество обращений к базе данных номеров.

person Brent    schedule 10.05.2012