以增加收藏夹功能为实例,解析asp.net forums2结构流程及组件设计

td id = " 1 " class = " ControlPanelTabInactive " align = " center " nowrap >
< a href = " =Globals.GetSiteUrls().MyFavorites " >``` = ResourceManager.GetString( " MyFavorites_Title " )

 1修改:  &lt; td colspan  =  11  class  =  "  ControlPanelTabLine  "  &gt;&lt; img width  =  "  1  "  height  =  1  alt  =  ""  &gt;
 2跨跃列数   
 3  
 4**五.增加相应文件  
 5  
 6表现层1,收藏夹主视图   
 7** 在web  /  user  /  目录增加MyFavorites.aspx,最终用户页面   
 8在Controls\Views目录增加MyFavoritesView.cs,页面视图服务器控件(主要表现为页面处理逻辑)   
 9界面视图:在Web\Themes\  default  \Skins中增加View  \-  MyFavorites.ascx 收藏夹视图(主要表现为页面UI)   
10  
11**组件**   
12在Components目录增加Favorites.cs(相当于业务逻辑层,加s表业务处理),此例中未在子目录Components  /  Components中增加Favorite.cs(相当于业务实体层,未加s表实体),因并不需要,完整的Asp.net forums模式应该还有这一层。   
13  
14**表现层2,用户点击收藏按钮后呈现的UI  
15** (这个比较简单)   
16在web目录增加MyFavoritesAdd.aspx文件   
17处理加入收藏时服务器控件, 在Controls目录增加MyFavoritesAdd.cs(页面处理逻辑)   
18在Web\Themes\  default  \Skins中增加Skin  \-  MyFavoritesAdd.ascx将主题加入收藏时的视图(UI)   
19  
20**六.数据库**   
21**增加表forums_Favorites**   
22UserID  int  4  0    
23ThreadID  int  4  0    
24FavoriteDate datetime  8  0    
25  
26**创建存储过程forums_Favorites_CreateDelete**   
27CREATE procedure forums_Favorites_CreateDelete   
28(   
29@UserID  int  ,   
30@ThreadID  int  ,   
31@Action  int    
32)   
33AS   
34BEGIN   
35  
36IF @Action  =  0    
37BEGIN   
38\--  Does the user already have the ability to see  this  thread  ?    
39IF EXISTS (SELECT UserID FROM forums_Favorites WHERE UserID  =  @UserID and ThreadID  =  @ThreadID)   
40return    
41  
42INSERT INTO   
43forums_Favorites   
44VALUES   
45(   
46@UserID,   
47@ThreadID,   
48getdate()   
49)   
50  
51RETURN   
52END   
53  
54IF @Action  =  2    
55BEGIN   
56DELETE   
57forums_Favorites   
58WHERE   
59UserID  =  @UserID AND   
60ThreadID  =  @ThreadID   
61RETURN   
62END   
63  
64END   
65GO   
66SET QUOTED_IDENTIFIER OFF   
67GO   
68SET ANSI_NULLS ON   
69GO   
70  
71**七.数据处理  
72** **1** **.Components\Provider\ForumsDataProvider.cs增加  
73** #region  收藏夹    
74public  abstract  void  CreateFavorites(ArrayList users,  int  threadID);   
75public  abstract  void  DeleteFavorites(  int  userID, ArrayList deleteList);   
76#endregion    
77**2** **. Data Providers\SqlDataProvider\SqlDataProvider.cs增加实现方法**   
78#region  #### 收藏夹 #### by venjiang 0912    
79///
/// 追加主题到收藏夹 /// ``` /// ``` ``` 用户ID /// ``` ``` 主题ID public override void CreateFavorites( int userID, int threadID) { using ( SqlConnection myConnection = GetSqlConnection() ) { SqlCommand myCommand = new SqlCommand(databaseOwner \+ " .forums_Favorites_CreateDelete " , myConnection); myCommand.CommandType = CommandType.StoredProcedure;

myCommand.Parameters.Add( " @Action " , SqlDbType.Bit).Value = DataProviderAction.Create;
myCommand.Parameters.Add( " @UserID " , SqlDbType.Int);
myCommand.Parameters.Add( " @ThreadID " , SqlDbType.Int);

myConnection.Open();
myCommand.Parameters[ " @UserID " ].Value = userID;
myCommand.Parameters[ " @ThreadID " ].Value = threadID;

myCommand.ExecuteNonQuery();
}
}
///

1<summary>   
2///  从收藏夹中删除主题   
3///  </summary>

///

1<param name="userID"/>

用户ID
///

1<param name="deleteList"/>

删除列表
public override void DeleteFavorites( int userID, ArrayList deleteList)
{

// Create Instance of Connection and Command Object
using ( SqlConnection myConnection = GetSqlConnection() )
{
SqlCommand myCommand = new SqlCommand(databaseOwner + " .forums_Favorites_CreateDelete " , myConnection);
myCommand.CommandType = CommandType.StoredProcedure;

myCommand.Parameters.Add( " @Action " , SqlDbType.Int).Value = DataProviderAction.Delete;
myCommand.Parameters.Add( " @UserID " , SqlDbType.Int).Value = userID;
myCommand.Parameters.Add( " @ThreadID " , SqlDbType.Int);

// Open the connection
myConnection.Open();

// Add multiple times
//
foreach ( int threadID in deleteList)
{
myCommand.Parameters[ " @ThreadID " ].Value = threadID;

myCommand.ExecuteNonQuery();

}
}
}
#endregion
3 **.在Data Providers\SqlDataProvider\SqlDataProvider.cs修改GetThreads方法,以支持收藏功能
** #region #### Threads ####
// 增加贴子收藏 by venjiang 0911
public override ThreadSet GetThreads(
int forumID,
int pageIndex,
int pageSize,
int userID,
DateTime threadsNewerThan,
SortThreadsBy sortBy,
SortOrder sortOrder,
ThreadStatus threadStatus,
ThreadUsersFilter userFilter,
bool activeTopics,
bool unreadOnly,
bool unansweredOnly,
bool returnRecordCount,
// 增加新参数,是否仅显示收藏的主题
bool favoriteOnly
)
{

// Create Instance of Connection and Command Object
//
using ( SqlConnection connection = GetSqlConnection() ) {
SqlCommand command = new SqlCommand(databaseOwner + " .forums_Threads_GetThreadSet " , connection);
command.CommandType = CommandType.StoredProcedure;

ThreadSet threadSet = new ThreadSet();
StringBuilder sqlCountSelect = new StringBuilder( " SELECT count(T.ThreadID) " );
StringBuilder sqlPopulateSelect = new StringBuilder( " SELECT T.ThreadID, HasRead = " );
StringBuilder fromClause = new StringBuilder( " FROM " + this .databaseOwner + " .forums_Threads T " );
StringBuilder whereClause = new StringBuilder( " WHERE " );
StringBuilder orderClause = new StringBuilder( " ORDER BY " );

// 增加收藏判断 by venjiang 0911
if (favoriteOnly == true )
{
fromClause.Append( " , " + this .databaseOwner + " .forums_Favorites Fav " );
}

// Ensure DateTime is min value for SQL
//
threadsNewerThan = SqlDataProvider.GetSafeSqlDateTime(threadsNewerThan);

// Construct the clauses
#region Constrain Forums

// Contrain the selectivness to a set of specified forums. The ForumID is our
// clustered index so we want this to be first
if (forumID > 0 ) {
whereClause.Append( " T.ForumID = " );
whereClause.Append(forumID);
} else if (forumID < 0 ) {
whereClause.Append( " (T.ForumID = " );

// Get a list of all the forums the user has access to
//
ArrayList forumList = Forums.GetForums(userID, false , true );

for ( int i = 0 ; i < forumList.Count; i ++ ) {

if ( ((Forum) forumList[i]).ForumID > 0 ) {
if ( (i + 1 ) < forumList.Count) {
whereClause.Append( ((Forum) forumList[i]).ForumID + " OR T.ForumID = " );
} else {
whereClause.Append( ((Forum) forumList[i]).ForumID );
whereClause.Append( " ) " );
}
}

}
} else {
whereClause.Append( " T.ForumID = 0 AND P.UserID = " );
whereClause.Append(userID);
whereClause.Append( " AND P.ThreadID = T.ThreadID " );
fromClause.Append( " , " + this .databaseOwner + " .forums_PrivateMessages P " );
}
#endregion

#region Constrain Date
whereClause.Append( " AND StickyDate >= ' " );
whereClause.Append( threadsNewerThan.ToString( System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.SortableDateTimePattern ));
whereClause.Append( " ' " );
#endregion

#region Constain Approval
whereClause.Append( " AND IsApproved = 1 " );
#endregion

#region Constrain Read/Unread
if (userID > 0 ) {
sqlPopulateSelect.Append( " (SELECT " + this .databaseOwner + " .HasReadPost( " );
sqlPopulateSelect.Append(userID);
sqlPopulateSelect.Append( " , T.ThreadID, T.ForumID)) " );

if (unreadOnly) {
whereClause.Append( " AND " + this .databaseOwner + " .HasReadPost( " );
whereClause.Append(userID);
whereClause.Append( " , T.ThreadID, T.ForumID) = 0 " );
}
} else {
sqlPopulateSelect.Append( " 0 " );
}
#endregion

#region Unanswered topics
if (unansweredOnly) {
whereClause.Append( " AND TotalReplies = 0 AND IsLocked = 0 " );
}
#endregion

#region Active topics
// 热门贴子
if (activeTopics) {
whereClause.Append( " AND TotalReplies > 2 AND IsLocked = 0 AND TotalViews > 50 " );
}
#endregion

#region 收藏
// 尽显示收藏的主题
if (favoriteOnly)
{
whereClause.Append( " AND T.ThreadID = Fav.ThreadID AND Fav.UserID = " );
whereClause.Append(userID);
}
#endregion

#region Users filter
if (userFilter != ThreadUsersFilter.All)
{

if ((userFilter == ThreadUsersFilter.HideTopicsParticipatedIn) || (userFilter == ThreadUsersFilter.HideTopicsNotParticipatedIn)) {

whereClause.Append( " AND " );
whereClause.Append(userID);

if (userFilter == ThreadUsersFilter.HideTopicsNotParticipatedIn)
whereClause.Append( " NOT " );

whereClause.Append( " IN (SELECT UserID FROM " + this .databaseOwner + " .forums_Posts P WHERE P.ThreadID = T.ThreadID) " );

} else {

if (userFilter == ThreadUsersFilter.HideTopicsByNonAnonymousUsers)
whereClause.Append( " AND 0 NOT " );
else
whereClause.Append( " AND 0 " );

whereClause.Append( " IN (SELECT UserID FROM " + this .databaseOwner + " .forums_Posts P WHERE ThreadID = T.ThreadID AND P.UserID = 0) " );
}
}
#endregion

#region Thread Status
if (threadStatus != ThreadStatus.NotSet) {
switch (threadStatus) {
case ThreadStatus.Open:
whereClause.Append( " AND ThreadStatus = 0 " );
break ;

case ThreadStatus.Closed:
whereClause.Append( " AND ThreadStatus = 0 " );
break ;

case ThreadStatus.Resolved:
whereClause.Append( " AND ThreadStatus = 0 " );
break ;

default :
break ;
}
}
#endregion

#region Order By
switch (sortBy) {
case SortThreadsBy.LastPost:
if (sortOrder == SortOrder.Ascending) {
if (activeTopics || unansweredOnly)
orderClause.Append( " ThreadDate " );
else
orderClause.Append( " IsSticky, StickyDate " );
} else {
if (activeTopics || unansweredOnly)
orderClause.Append( " ThreadDate DESC " );
else
orderClause.Append( " IsSticky DESC, StickyDate DESC " );
}
break ;

case SortThreadsBy.TotalRatings:
if (sortOrder == SortOrder.Ascending)
orderClause.Append( " TotalRatings " );
else
orderClause.Append( " TotalRatings DESC " );
&nb

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus