这应该是一个基本问题,我认为缺乏精确的搜索术语是我无法找到答案的原因。
我正在处理的数据库包含一个只有大约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事件处理程序) - 总是感激不尽。
答案 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,以便存在更新和删除功能,但最大限度地减少数据库调用次数。