以增进保藏夹成果为实例,理会asp.net forums2布局流程及组件计划
发布时间:2018-08-20 16:23:02 所属栏目:电商 来源:站长网
导读:td id=1 class=ControlPanelTabInactive align=center nowrap a href=%=Globals.GetSiteUrls().MyFavorites%%=ResourceManager.GetString(MyFavorites_Title)%/a /td修改: td colspan=11 class=ControlPanelTabLineimg width=1 height=1 alt=/td跨跃列数
td id="1" class="ControlPanelTabInactive" align="center" nowrap> <a href="<%=Globals.GetSiteUrls().MyFavorites%>"><%=ResourceManager.GetString("MyFavorites_Title")%></a> </td>修改: <td colspan=11 class="ControlPanelTabLine"><img width="1" height=1 alt=""></td>跨跃列数五.增进响应文件示意层1,保藏夹主视图在web/user/目次增进MyFavorites.aspx,最终用户页面在ControlsViews目次增进MyFavoritesView.cs,页面视图处事器控件(首要示意为页面处理赏罚逻辑)界面视图:在WebThemesdefault kins中增进View-MyFavorites.ascx 保藏夹视图(首要示意为页面UI)组件在Components目次增进Favorites.cs(相等于营业逻辑层,加s表营业处理赏罚),此例中未在子目次Components/Components中增进Favorite.cs(相等于营业实体层,未加s表实体),因并不必要,完备的Asp.net forums模式应该尚有这一层。示意层2,用户点击保藏按钮后泛起的UI(这个较量简朴)在web目次增进MyFavoritesAdd.aspx文件处理赏罚插手保藏时处事器控件, 在Controls目次增进MyFavoritesAdd.cs(页面处理赏罚逻辑)在WebThemesdefault kins中增进Skin-MyFavoritesAdd.ascx将主题插手保藏时的视图(UI)六.数据库增进表forums_FavoritesUserID int 4 0ThreadID int 4 0FavoriteDate datetime 8 0建设存储进程forums_Favorites_CreateDeleteCREATE procedure forums_Favorites_CreateDelete( @UserID int, @ThreadID int, @Action int)ASBEGINIF @Action = 0BEGIN -- Does the user already have the ability to see this thread? IF EXISTS (SELECT UserID FROM forums_Favorites WHERE UserID = @UserID and ThreadID = @ThreadID) return INSERT INTO forums_Favorites VALUES ( @UserID, @ThreadID, getdate() ) RETURNENDIF @Action = 2BEGIN DELETE forums_Favorites WHERE UserID = @UserID AND ThreadID = @ThreadID RETURNENDENDGOSET QUOTED_IDENTIFIER OFF GOSET ANSI_NULLS ON GO七.数据处理赏罚1.ComponentsProviderForumsDataProvider.cs增进#region 保藏夹 public abstract void CreateFavorites(ArrayList users, int threadID); public abstract void DeleteFavorites(int userID, ArrayList deleteList); #endregion2. Data Providers qlDataProvider qlDataProvider.cs增进实现要领#region #### 保藏夹 #### by venjiang 0912 /// <summary> /// 追加主题到保藏夹 /// </summary> /// <param name="userID">用户ID</param> /// <param name="threadID">主题ID</param> 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(); } } /// <summary> /// 从保藏夹中删除主题 /// </summary> /// <param name="userID">用户ID</param> /// <param name="deleteList">删除列表</param> 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(); } } } #endregion3.在Data Providers qlDataProvider qlDataProvider.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"); break; case SortThreadsBy.TotalReplies: if (sortOrder == SortOrder.Ascending) orderClause.Append("TotalReplies"); else orderClause.Append("TotalReplies DESC"); break; case SortThreadsBy.ThreadAuthor: if (sortOrder == SortOrder.Ascending) orderClause.Append("PostAuthor DESC"); else orderClause.Append("PostAuthor"); break; case SortThreadsBy.TotalViews: if (sortOrder == SortOrder.Ascending) orderClause.Append("TotalViews"); else orderClause.Append("TotalViews DESC"); break; } #endregion // Build the SQL statements sqlCountSelect.Append(fromClause.ToString()); sqlCountSelect.Append(whereClause.ToString()); sqlPopulateSelect.Append(fromClause.ToString()); sqlPopulateSelect.Append(whereClause.ToString()); sqlPopulateSelect.Append(orderClause.ToString()); // Add Parameters to SPROC // command.Parameters.Add("@ForumID", SqlDbType.Int).Value = forumID; command.Parameters.Add("@PageIndex", SqlDbType.Int, 4).Value = pageIndex; command.Parameters.Add("@PageSize", SqlDbType.Int, 4).Value = pageSize; command.Parameters.Add("@sqlCount", SqlDbType.NVarChar, 4000).Value = sqlCountSelect.ToString(); command.Parameters.Add("@sqlPopulate", SqlDbType.NVarChar, 4000).Value = sqlPopulateSelect.ToString(); command.Parameters.Add("@UserID", SqlDbType.Int).Value = userID; command.Parameters.Add("@ReturnRecordCount", SqlDbType.Bit).Value = returnRecordCount; // Execute the command connection.Open(); SqlDataReader dr = command.ExecuteReader(); // Populate the ThreadSet // while (dr.Read()) { // Add threads // if (forumID == 0) threadSet.Threads.Add( ForumsDataProvider.PopulatePrivateMessageFromIDataReader (dr) ); else threadSet.Threads.Add( ForumsDataProvider.PopulateThreadFromIDataReader(dr) ); } // Do we need to return record count? // if (returnRecordCount) { dr.NextResult(); dr.Read(); // Read the total records // threadSet.TotalRecords = (int) dr[0]; } // Get the recipients if this is a request for // the private message list if ((forumID == 0) && (dr.NextResult()) ) { Hashtable recipientsLookupTable = new Hashtable(); while(dr.Read()) { int threadID = (int) dr["ThreadID"]; if (recipientsLookupTable[threadID] == null) { recipientsLookupTable[threadID] = new ArrayList(); } ((ArrayList) recipientsLookupTable[threadID]).Add(ForumsDataProvider.PopulateUserFromIDataReader(dr) ); } // Map recipients to the threads // foreach (PrivateMessage thread in threadSet.Threads) { thread.Recipients = (ArrayList) recipientsLookupTable[thread.ThreadID]; } } dr.Close(); connection.Close(); return threadSet; } } #endregion八.增进新要领在ComponentsThreads.cs增进新的重载要领,以不必修改原本的要领挪用.// 为了不影响早年的措施,单独加一个重载要领,以得到保藏夹主题 public static 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) // 多了一个参数favoriteOnly { ForumContext forumContext = ForumContext.Current; string anonymousKey = "Thread-" + forumID + pageSize.ToString() + pageIndex.ToString() + threadsNewerThan.DayOfYear.ToString() + sortBy + sortOrder + activeTopics.ToString() + unansweredOnly.ToString() + favoriteOnly.ToString(); ThreadSet threadSet; // If the user is anonymous take some load off the db // if (userID == 0) { if (forumContext.Context.Cache[anonymousKey] != null) return (ThreadSet) forumContext.Context.Cache[anonymousKey]; } // Create Instance of the IDataProvider // ForumsDataProvider dp = ForumsDataProvider.Instance(); // Get the threads // threadSet = dp.GetThreads(forumID, pageIndex, pageSize, userID, threadsNewerThan, sortBy, sortOrder, threadStatus, userFilter, activeTopics, unreadOnly, unansweredOnly, returnRecordCount,favoriteOnly); if (userID == 0) forumContext.Context.Cache.Insert(anonymousKey, threadSet, null, DateTime.Now.AddMinutes(2), TimeSpan.Zero, CacheItemPriority.Low, null); return threadSet; }九.营业逻辑层Components目次中增进Favorites.cs,实现主题的增进删除要领public static void AddFavoritesPost (int userID,int threadID) { ForumsDataProvider dp = ForumsDataProvider.Instance(); dp.CreateFavorites(userID, threadID); } /// <summary> /// 删除保藏 /// </summary> /// <param name="userID">用户ID</param> /// <param name="deleteList">删除列表</param> public static void DeleteFavorites (int userID, ArrayList deleteList) { // ForumsDataProvider dp = ForumsDataProvider.Instance(); dp.DeleteFavorites(userID, deleteList); }十.示意层挪用1.保藏夹主视图加载保藏主题列表 threadSet = Threads.GetThreads(forumID, pager.PageIndex, pager.PageSize, Users.GetUser().UserID, dateFilterValue, threadSortddl.SelectedValue, sortOrderddl.SelectedValue, ThreadStatus.NotSet, ThreadUsersFilter.All, false, hideReadPosts.SelectedValue, false, true,true);留意最后一个参数是true,即返回保藏夹的数据集。2.增进主题到保藏夹 Favorites.AddFavoritesPost(user.UserID,post.ThreadID); HttpContext.Current.Response.Redirect(Globals.ApplicationPath+"/MyFavoritesAdd.aspx",true);3.删除保藏的主题 Favorites.DeleteFavorites(…) (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读