由 CategoriesModule 实现的“Browse Categories”(浏览类别)用户控件位于大多数 ASP.NET 页的左边,它使用户能够按类别查找书籍。类别包括:
Anthropology(人类学)
Art(艺术)
Biography(传记)
Business(商业)
Computers(计算机)
Cookbooks(烹饪)
Essays(散文)
Fiction(小说)
History(历史)
Literature Critiques(文学评论)
Mythology(神话)
Philosophy(哲学)
Poetry & Plays(诗歌和戏剧)
Psychology(心理学)
Reference(参考)
Science(科学)
Sports(体育)
Travel(旅行)
DailyPickModule 用户控件创建一个与每个 ASP.NET 页顶部的每个类别(历史等)关联的“Pick Of The Day”(每日精选)。
实现
类别浏览功能使用下面的 ASP.NET 文件和 C# 或 Visual Basic .NET 代码隐藏文件:
Categories.aspx
Categories.aspx.cs
Categories.aspx.vb
注意 有关 ASP.NET 代码隐藏的更多信息,请参见创建 ASP.NET Web 应用程序。
过程概述
用户选择了某个类别(如历史)后,URL 的参数将类别 ID 传递到“Categories”(类别)页的 Page_Load 函数。然后 Page_Load 函数为所选类别中的图书调用业务外观层的 Duwamish7.BusinessFacade.ProductSystem.GetCategoryItems 方法。下一步,Duwamish7.BusinessFacade.ProductSystem.GetCategoryItems 方法调用数据访问层的 Duwamish7.DataAccess.Books.GetBooksByCategoryId 方法,后者接着调用 GetBooksByCategoryID 存储过程 (SPROC),以显示与所选类别相关联的项列表。另外,Page_Load 函数使用 DailyPickModule 用户控件显示请求类别的关联的图书。若要检索每日精选,可使用业务外观层的 Duwamish7.BusinessFacade.ProductSystem.GetDailyPickItems 方法调用数据访问层的 Duwamish7.DataAccess.Books.GetDailyPickBooksByCategoryId 方法和 GetDailyPickBooksByCategoryId SPROC。然后 ASP.NET 页 DataBind() 方法将 ASP.NET 页与请求类别的图书和每日精选绑定在一起。
结构决策
Duwamish 7.0 对“每日精选”使用一个用户控件。该用户控件在“Default”(默认)和“Categories”(类别)页上重新使用。
若要查找适用于本主题中特定层的源代码,请单击相应的链接:
业务外观源代码 | 数据访问源代码 | SPROC
Web 源代码
Web 源代码的默认位置是 [安装 Visual Studio .NET 的驱动器号]:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Web/Categories.aspx.cs 文件。
注意 如果安装了 Visual Basic .NET 版本,则 Duwamish 7.0 VB 将替换路径中的 Duwamish 7.0 CS,其文件名相同,但扩展名是 vb 而不是 cs。
Page_Load:
[C#]
/// <summary>
/// Populate the page with the category information then mark
/// the page as cached.
/// <remarks>Called whenever the page is loaded.</remarks>
/// <param name="sender">The source of the event.</param>
/// <param name="e">An EventArgs that contains the event data.</param>
/// </summary>
protected void Page_Load(Object sender, EventArgs e)
{
int categoryID = -1; // Default value
if (!IsPostBack)
{
...
//
// Read the books in the category
//
BookData itemSet = productSystem.GetCategoryItems(categoryID);
//
// Save the view for data binding
//
itemView = itemSet.Tables[BookData.BOOKS_TABLE].DefaultView;
//
// Set the DailyPick category
//
ModuleDailyPick.CategoryID = categoryID;
...
//
// Remind the page that it needs bind its controls to the data.
//
DataBind();
}
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Sub Categories_Load:
' Populate the page with the category information then mark
' the page as cached.
'----------------------------------------------------------------
Private Sub Categories_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim categoryID As Integer = -1 ' Default Value
If Not Me.IsPostback Then
...
'
' Read the books in the category
'
Dim itemSet As BookData
itemSet = productSystem.GetCategoryItems(categoryID)
'
' Save the view for data binding
'
itemView = itemSet.Tables(BookData.BOOKS_TABLE).DefaultView
'
' Set the DailyPick category
'
ModuleDailyPick.CategoryID = categoryID
...
'
' Remind the page that it needs bind its controls to the data.
'
DataBind()
End If
End Sub
业务外观源代码
Duwamish7.BusinessFacade.ProductSystem.GetCategoryItems 方法和 Duwamish7.BusinessFacade.ProductSystem.GetDailyPickItems 方法源代码的默认位置是 [安装 Visual Studio .NET 的驱动器号]:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Business/Facade/ProductSystem.cs 文件。
注意 如果安装了 Visual Basic .NET 版本,则 Duwamish 7.0 VB 将替换路径中的 Duwamish 7.0 CS,其文件名相同,但扩展名是 vb 而不是 cs。
Duwamish7.BusinessFacade.ProductSystem.GetCategoryItems 方法:
[C#]
/// <summary>
/// Retrieves a BookData dataset containing all the items in the specified category.
/// <param name="categoryId">The category id for item retrieval.</param>
/// <retvalue>A BookData dataset containing all the items in the specified category.</retvalue>
/// <exception> class='System.ApplicationException'>
/// The categoryId is invalid.
/// </exception>
/// </summary>
public BookData GetCategoryItems(int categoryId)
{
//
// Check preconditions
//
ApplicationAssert.CheckCondition(categoryId >= 0,"Invalid Category Id",ApplicationAssert.LineNumber);
//
// Retrieve the data
//
using (Books bookDataAccess = new Books())
{
return bookDataAccess.GetBooksByCategoryId(categoryId);
}
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function GetCategoryItems
' Retrieves a dataset containing all the items in the specified
' category.
' Returns:
' A dataset containing all the items in the specified
' category.
' Parameters:
' [in] categoryId: The category id for item retrieval
'----------------------------------------------------------------
Public Function GetCategoryItems(ByVal categoryId As Integer) As BookData
'
' Check preconditions
'
ApplicationAssert.CheckCondition(categoryId >= 0,"Invalid Category Id",ApplicationAssert.LineNumber)
'
' Retrieve the data
'
With New Books
GetCategoryItems = .GetBooksByCategoryId(categoryId)
End With
End Function
Duwamish7.BusinessFacade.ProductSystem.GetDailyPickItems 方法:
[C#]
// <summary>
/// Retrieves a BookData dataset containing all the DailyPick items in the specified category.
/// <param name="categoryId">The category id for DailyPick item retrieval.</param>
/// <retvalue>A BookData dataset containing all the DailyPick items in the specified category.</retvalue>
/// <exception> class='System.ApplicationException'>
/// The categoryId is invalid.
/// </exception>
/// </summary>
public BookData GetDailyPickItems(int categoryId)
{
//
// Check preconditions
//
ApplicationAssert.CheckCondition(categoryId > 0,"Invalid Category Id",ApplicationAssert.LineNumber);
//
// Retrieve the data
//
using (Books bookDataAccess = new Books())
{
return bookDataAccess.GetDailyPickBooksByCategoryId(categoryId);
}
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function GetDailyPickItems
' Retrieves a dataset containing all the DailyPick items in the
' specified category.
' Returns:
' A dataset containing all the DailyPick items in the specified
' category.
' Parameters:
' [in] categoryId: The category id for DailyPick item retrieval
'----------------------------------------------------------------
Public Function GetDailyPickItems(ByVal categoryId As Integer) As BookData
'
' Check preconditions
'
ApplicationAssert.CheckCondition(categoryId > 0,"Invalid Category Id",ApplicationAssert.LineNumber)
'
' Retrieve the data
'
With New Books
GetDailyPickItems = .GetDailyPickBooksByCategoryId(categoryId)
End With
End Function
数据访问源代码
Duwamish7.DataAccess.Books.GetBooksByCategoryId 方法和 Duwamish7.DataAccess.Books.GetDailyPickBooksByCategoryId 方法源代码的默认位置是 [安装 Visual Studio .NET 的驱动器号]:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/DataAccess/Books.cs 文件。
注意 如果安装了 Visual Basic .NET 版本,则 Duwamish 7.0 VB 将替换路径中的 Duwamish 7.0 CS,其文件名相同,但扩展名是 vb 而不是 cs。
Duwamish7.DataAccess.Books.GetBooksByCategoryId 方法:
[C#]
/// <summary>
/// Retrieves all books for a specified category.
/// <param name="categoryId">Id of category to search for.</param>
/// <retvalue>BookData, a dataset containing detailed book information.</retvalue>
/// </summary>
public BookData GetBooksByCategoryId(int categoryId)
{
return FillBookData("GetBooksByCategoryId", "@CategoryId", categoryId.ToString());
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function GetBooksByCategoryId:
' Retrieves all books for a specified category.
' Returns:
' BookData, a dataset containing detailed book information.
' Parameters:
' [in] categoryId: Id of category to search for.
'----------------------------------------------------------------
Public Function GetBooksByCategoryId(ByVal categoryId As Integer) As BookData
GetBooksByCategoryId = FillBookData("GetBooksByCategoryId", "@CategoryId", CStr(categoryId))
End Function
Duwamish7.DataAccess.Books.GetDailyPickBooksByCategoryId 方法:
[C#]
/// <summary>
/// Retrieves DailyPick books for a specified category.
/// <param name="categoryId">Id of category to search for.</param>
/// <retvalue>BookData, a dataset containing detailed DailyPick book </retvalue>
/// </summary>
public BookData GetDailyPickBooksByCategoryId(int categoryId)
{
return FillBookData("GetDailyPickBooksByCategoryId", "@CategoryId", categoryId.ToString());
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function GetDailyPickBooksByCategoryId:
' Retrieves DailyPick books for a specified category.
' Returns:
' BookData, a dataset containing detailed DailyPick book
' information.
' Parameters:
' [in] categoryId: Id of category to search for.
'----------------------------------------------------------------
Public Function GetDailyPickBooksByCategoryId(ByVal categoryId As Integer) As BookData
GetDailyPickBooksByCategoryId = FillBookData("GetDailyPickBooksByCategoryId", "@CategoryId", CStr(categoryId))
End Function
创建和填充 BookData 数据集的 Helper 函数:
[C#]
//----------------------------------------------------------------
// Function FillBookData:
// Helper function to create and populate a BookData dataset
// Returns:
// BookData, a dataset containing detailed book information.
// Parameters:
// [in] commandText: sql stored procedure to run.
// [in] paramName: sql paramater name.
// [in] paramValue: sql paramater.
//----------------------------------------------------------------
private BookData FillBookData(String commandText, String paramName, String paramValue)
{
if (dsCommand == null )
{
throw new System.ObjectDisposedException( GetType().FullName );
}
BookData data = new BookData();
SqlCommand command = dsCommand.SelectCommand;
command.CommandText = commandText;
command.CommandType = CommandType.StoredProcedure; // use stored proc for perf
SqlParameter param = new SqlParameter(paramName, SqlDbType.NVarChar, 255);
param.Value = paramValue;
command.Parameters.Add(param);
dsCommand.Fill(data);
return data;
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function FillBookData:
' Helper function to create and populate a BookData dataset
' Returns:
' BookData, a dataset containing detailed book information.
' Parameters:
' [in] cmdText: sql stored procedure to run.
' [in] paramName: sql paramater name.
' [in] paramValue: sql paramater.
'----------------------------------------------------------------
Private Function FillBookData(ByVal cmdText As String, ByVal paramName As String, ByVal paramValue As String) As BookData
Dim data As BookData
data = New BookData
With dsCommand
Try
With .SelectCommand
.CommandType = CommandType.StoredProcedure ' use stored proc for perf
.CommandText = cmdText
Dim param As SqlParameter = new SqlParameter(paramName, SqlDbType.NVarChar, 255)
param.Value = paramValue
.Parameters.Add(param)
End With
.Fill(data)
Finally
If Not .SelectCommand Is Nothing Then
If Not .SelectCommand.Connection Is Nothing Then
.SelectCommand.Connection.Dispose()
End If
.SelectCommand.Dispose()
End If
.Dispose()
End Try
End With
FillBookData = data
End Function
SPROC
SQL 存储过程的默认位置是 [安装 Visual Studio .NET 的驱动器号]:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Database/Sql/d7_sprocs.sql 文件。
注意 如果安装了 Visual Basic .NET 版本,则 Duwamish 7.0 VB 将替换路径中的 Duwamish 7.0 CS。
GetBooksByCategoryId SPROC:
--------------------------------------------------
-- GetBooksByCategoryId
--------------------------------------------------
CREATE PROCEDURE GetBooksByCategoryId
@CategoryId INT
AS
SET NOCOUNT ON
SELECT TOP 50
i.PKId,
i.TypeId,
b.PublisherId,
b.ISBN,
i.ImageFileSpec,
i.Name 'Title',
i.Description,
i.UnitPrice,
i.UnitCost,
t.Name 'ItemType',
p.Name 'PublisherName'
FROM Items i,
Books b,
ItemCategory c,
ItemType t,
Publishers p
WHERE c.CategoryId = @CategoryId
AND i.PKId = c.ItemId
AND b.ItemId= i.PKId
AND p.PKId = b.PublisherId
AND t.PKId = i.TypeId
ORDER BY i.PKId
RETURN 0
GetDailyPickBooksByCategoryId SPROC:
--------------------------------------------------
-- GetDailyPickBooksByCategoryId
--------------------------------------------------
CREATE PROCEDURE GetDailyPickBooksByCategoryId
@CategoryId INT
AS
SET NOCOUNT ON
SELECT TOP 50
i.PKId,
i.TypeId,
b.PublisherId,
b.ISBN,
i.ImageFileSpec,
i.Name 'Title',
i.Description,
i.UnitPrice,
i.UnitCost,
t.Name 'ItemType',
p.Name 'PublisherName'
FROM Items i,
Books b,
DailyPick c,
ItemType t,
Publishers p
WHERE c.CategoryId = @CategoryId
AND i.PKId = c.ItemId
AND b.ItemId= i.PKId
AND p.PKId = b.PublisherId
AND t.PKId = i.TypeId
ORDER BY i.PKId
RETURN 0