ASP.NET 4.0 dropDownList作为select参数 - 最小化发送到数据库的查询

时间:2012-05-05 23:02:29

标签: asp.net drop-down-menu objectdatasource

这应该是一个基本问题,我认为缺乏精确的搜索术语是我无法找到答案的原因。

我正在处理的数据库包含一个只有大约6行和5个字段的小表。它确实需要CRUD功能,因为它会偶尔发生变化,但几乎肯定不会超过十几行。

ASP.NET Web应用程序具有业务逻辑和数据访问层。

我想将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编写特定的事件处理程序),但是在单个数据库查询上构建可枚举列表,并让两个控件都访问同一个对象(?使用detailsView分页控件?)?后面的代码是c#,但如果有人有任何示例/链接,则vb很好。

感谢您的想法(即使这些想法不再是懒惰,抛弃objectDataSources并且只是手动编写detailsview事件处理程序) - 总是感激不尽。

1 个答案:

答案 0 :(得分:0)

想出一个方法,但是如果觉得这有点hackish或者存在更好的解决方案,请发布替代方案:

在网页的代码隐藏文件中,设置一个私有变量,以便在页面构建周期中保持对商务层对象的引用,并设置对象创建和创建事件处理程序:

    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;
        }
    }

在商务层中,有一个私有变量指向第一个对象数据源使用的相同可枚举列表,并按如下方式处理select:

    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);
        }
    }

当然,应该手动处理处理商务对象,以便尽快关闭数据库连接。

我希望将相同的策略应用于listView中的嵌套(嵌入式)objectDataSource,以便存在更新和删除功能,但最大限度地减少数据库调用次数。