1

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

我正在处理的数据库包含一个只有大约 6 行和 5 个字段的小表。它确实需要 CRUD 功能,因为它会偶尔更改,但几乎可以肯定永远不会扩展到超过十几行。

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

我想要一个 dropDownList 作为伪“分页”控件,以选择要在 detailsView 中显示的行。

快速而讨厌的解决方案是在 ASP 中放置 2 个 objectDataSource 控件,一个带有选择参数:

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

谢谢你的想法(即使这些想法是停止懒惰,放弃两个 objectDataSources 并手动编写 detailsview 事件处理程序) - 总是很感激。

4

1 回答 1

0

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

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

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

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

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

于 2012-05-10T20:32:35.910 回答